In this notebook we conduct exploratory factor analyses (EFAs) on the datasets for our studies of concepts of mental life, in which each participants judged the various mental capacities of a particular target entity. We analyze datasets for adults and children from each of our five field sites: the US, Ghana, Thailand, China, and Vanuatu.

This notebook contains the results presented in the main text, in which we use Pearson correlations with our three-point response scale (no = 0, kinda = 0.5, yes = 1); see supplemental analyses for a version of these analyses treating kinda = yes = 1 and using tetrachoric correlations.

Demographic matching

Gender/sex

Parallel analysis suggests that the number of factors =  3  and the number of components =  2 
[1] 3

Parallel analysis suggests that the number of factors =  3  and the number of components =  2 
[1] 3

Parallel analysis suggests that the number of factors =  2  and the number of components =  2 
[1] 2

Age

Matching

Adults

Samples

  country   n
       US 123
    Ghana 148
 Thailand 146
    China 115
  Vanuatu 138
    Total 670

Scale use

Factor retention: parallel analysis

Exploratory factor analysis

convergence not obtained in GPFoblq. 1000 iterations used.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.Matrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneThe estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.Matrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneThe estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.Matrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneThe estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.An ultra-Heywood case was detected.  Examine the results carefullyThe estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.Matrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneThe estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.Matrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneThe estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.Matrix was not positive definite, smoothing was doneThe estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.Matrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneThe estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.Matrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneThe estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.Matrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneThe estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.Matrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneThe estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.Matrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneThe estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.Matrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneThe estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.Matrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneThe estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.Matrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneThe estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.Matrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneThe estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.Matrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneThe estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.Matrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneThe estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.Matrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneThe estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.Matrix was not positive definite, smoothing was doneThe estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.

Factor loadings

the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be used

Congruence

Bootstrapped congruence

Children

Samples

  country   n
       US 117
    Ghana 150
 Thailand 152
    China 131
  Vanuatu 143
    Total 693

Scale use

Factor retention: parallel analysis

Error in saveRDS(pa_outcomes_dist_children, file = "../results/pa_outcomes_dist_children_demobal.RDS") : 
  object 'pa_outcomes_dist_children' not found

Exploratory factor analysis

Factor loadings

Congruence

See All samples, below.

Bootstrapped congruence

All samples

Congruence

Jaccard Similarity

Developmental comparisons

Other metrics of similarity

Variance accounted for

Interfactor correlations

LS0tCnRpdGxlOiAiQ29uY2VwdHMgb2YgbWVudGFsIGxpZmUgYWNyb3NzIGN1bHR1cmVzOiBQcmltYXJ5IGFuYWx5c2lzIgphdXRob3JzOiAiV2Vpc21hbiwgTGVnYXJlLCAmIEx1aHJtYW5uIgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQotLS0KCmBgYHtyIHNldHVwfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEYsIG1lc3NhZ2UgPSBGKQpgYGAKCkluIHRoaXMgbm90ZWJvb2sgd2UgY29uZHVjdCBleHBsb3JhdG9yeSBmYWN0b3IgYW5hbHlzZXMgKEVGQXMpIG9uIHRoZSBkYXRhc2V0cyBmb3Igb3VyIHN0dWRpZXMgb2YgY29uY2VwdHMgb2YgbWVudGFsIGxpZmUsIGluIHdoaWNoIGVhY2ggcGFydGljaXBhbnRzIGp1ZGdlZCB0aGUgdmFyaW91cyBtZW50YWwgY2FwYWNpdGllcyBvZiBhIHBhcnRpY3VsYXIgdGFyZ2V0IGVudGl0eS4gV2UgYW5hbHl6ZSBkYXRhc2V0cyBmb3IgYWR1bHRzIGFuZCBjaGlsZHJlbiBmcm9tIGVhY2ggb2Ygb3VyIGZpdmUgZmllbGQgc2l0ZXM6IHRoZSBVUywgR2hhbmEsIFRoYWlsYW5kLCBDaGluYSwgYW5kIFZhbnVhdHUuIAoKVGhpcyBub3RlYm9vayBjb250YWlucyB0aGUgcmVzdWx0cyBwcmVzZW50ZWQgaW4gdGhlIG1haW4gdGV4dCwgaW4gd2hpY2ggd2UgdXNlIFBlYXJzb24gY29ycmVsYXRpb25zIHdpdGggb3VyIHRocmVlLXBvaW50IHJlc3BvbnNlIHNjYWxlIChubyA9IDAsIGtpbmRhID0gMC41LCB5ZXMgPSAxKTsgc2VlIHN1cHBsZW1lbnRhbCBhbmFseXNlcyBmb3IgYSB2ZXJzaW9uIG9mIHRoZXNlIGFuYWx5c2VzIHRyZWF0aW5nIGtpbmRhID0geWVzID0gMSBhbmQgdXNpbmcgdGV0cmFjaG9yaWMgY29ycmVsYXRpb25zLgoKCmBgYHtyLCBlY2hvID0gRiwgbWVzc2FnZSA9IEZ9CnNvdXJjZSgiLi9zY3JpcHRzL2RlcGVuZGVuY2llcy5SIikKc291cmNlKCIuL3NjcmlwdHMvY3VzdG9tX2Z1bnMuUiIpCnNvdXJjZSgiLi9zY3JpcHRzL3Zhcl9yZWNvZGVfY29udHJhc3QuUiIpCmBgYAoKYGBge3IgZGF0YX0KIyByZWFkIGluIGRhdGEsIHNob3J0ZW4gImZlZWwgc2ljaywiIGFuZCBsaW1pdCB0byB1bml2ZXJzYWwgdGFyZ2V0cyBhbmQgcXVlc3Rpb25zOiBhZHVsdHMKZF91c19hZHVsdHMgPC0gcmVhZF9jc3YoIi4uL2RhdGEvZF91c19hZHVsdHMuY3N2IikgJT4lCiAgZmlsdGVyKHRhcmdldCAlaW4lIGxldmVsc190YXJnZXRfdW5pdiwgcXVlc3Rpb25fY2F0ID09ICJ1bml2ZXJzYWwiKSAlPiUKICBtdXRhdGUocXVlc3Rpb24gPSBnc3ViKCJcXCwgLiokIiwgIiBcXFsuLi5cXF0iLCBxdWVzdGlvbikpCmRfZ2hfYWR1bHRzIDwtIHJlYWRfY3N2KCIuLi9kYXRhL2RfZ2hfYWR1bHRzLmNzdiIpICU+JQogIGZpbHRlcih0YXJnZXQgJWluJSBsZXZlbHNfdGFyZ2V0X3VuaXYsIHF1ZXN0aW9uX2NhdCA9PSAidW5pdmVyc2FsIikgJT4lCiAgbXV0YXRlKHF1ZXN0aW9uID0gZ3N1YigiXFwsIC4qJCIsICIgXFxbLi4uXFxdIiwgcXVlc3Rpb24pKQpkX3RoX2FkdWx0cyA8LSByZWFkX2NzdigiLi4vZGF0YS9kX3RoX2FkdWx0cy5jc3YiKSAlPiUKICBmaWx0ZXIodGFyZ2V0ICVpbiUgbGV2ZWxzX3RhcmdldF91bml2LCBxdWVzdGlvbl9jYXQgPT0gInVuaXZlcnNhbCIpICU+JQogIG11dGF0ZShxdWVzdGlvbiA9IGdzdWIoIlxcLCAuKiQiLCAiIFxcWy4uLlxcXSIsIHF1ZXN0aW9uKSkKZF9jaF9hZHVsdHMgPC0gcmVhZF9jc3YoIi4uL2RhdGEvZF9jaF9hZHVsdHMuY3N2IikgJT4lCiAgZmlsdGVyKHRhcmdldCAlaW4lIGxldmVsc190YXJnZXRfdW5pdiwgcXVlc3Rpb25fY2F0ID09ICJ1bml2ZXJzYWwiKSAlPiUKICBtdXRhdGUocXVlc3Rpb24gPSBnc3ViKCJcXCwgLiokIiwgIiBcXFsuLi5cXF0iLCBxdWVzdGlvbikpCmRfdnRfYWR1bHRzIDwtIHJlYWRfY3N2KCIuLi9kYXRhL2RfdnRfYWR1bHRzLmNzdiIpICU+JQogIGZpbHRlcih0YXJnZXQgJWluJSBsZXZlbHNfdGFyZ2V0X3VuaXYsIHF1ZXN0aW9uX2NhdCA9PSAidW5pdmVyc2FsIikgJT4lCiAgbXV0YXRlKHF1ZXN0aW9uID0gZ3N1YigiXFwsIC4qJCIsICIgXFxbLi4uXFxdIiwgcXVlc3Rpb24pKQoKIyByZWFkIGluIGRhdGEsIHNob3J0ZW4gImZlZWwgc2ljaywiIGFuZCBsaW1pdCB0byB1bml2ZXJzYWwgdGFyZ2V0cyBhbmQgcXVlc3Rpb25zOiBjaGlsZHJlbgpkX3VzX2NoaWxkcmVuIDwtIHJlYWRfY3N2KCIuLi9kYXRhL2RfdXNfY2hpbGRyZW4uY3N2IikgJT4lCiAgZmlsdGVyKHRhcmdldCAlaW4lIGxldmVsc190YXJnZXRfdW5pdiwgcXVlc3Rpb25fY2F0ID09ICJ1bml2ZXJzYWwiKSAlPiUKICBtdXRhdGUocXVlc3Rpb24gPSBnc3ViKCJcXCwgLiokIiwgIiBcXFsuLi5cXF0iLCBxdWVzdGlvbikpCmRfZ2hfY2hpbGRyZW4gPC0gcmVhZF9jc3YoIi4uL2RhdGEvZF9naF9jaGlsZHJlbi5jc3YiKSAlPiUKICBmaWx0ZXIodGFyZ2V0ICVpbiUgbGV2ZWxzX3RhcmdldF91bml2LCBxdWVzdGlvbl9jYXQgPT0gInVuaXZlcnNhbCIpICU+JQogIG11dGF0ZShxdWVzdGlvbiA9IGdzdWIoIlxcLCAuKiQiLCAiIFxcWy4uLlxcXSIsIHF1ZXN0aW9uKSkKIyBkX2doX2VuZ19jaGlsZHJlbiA8LSByZWFkX2NzdigiLi4vZGF0YS9kX2doX2VuZ19jaGlsZHJlbi5jc3YiKSAlPiUKIyAgIGZpbHRlcih0YXJnZXQgJWluJSBsZXZlbHNfdGFyZ2V0X3VuaXYsIHF1ZXN0aW9uX2NhdCA9PSAidW5pdmVyc2FsIikgJT4lCiMgICBtdXRhdGUocXVlc3Rpb24gPSBnc3ViKCJcXCwgLiokIiwgIiBcXFsuLi5cXF0iLCBxdWVzdGlvbikpCmRfdGhfY2hpbGRyZW4gPC0gcmVhZF9jc3YoIi4uL2RhdGEvZF90aF9jaGlsZHJlbi5jc3YiKSAlPiUKICBmaWx0ZXIodGFyZ2V0ICVpbiUgbGV2ZWxzX3RhcmdldF91bml2LCBxdWVzdGlvbl9jYXQgPT0gInVuaXZlcnNhbCIpICU+JQogIG11dGF0ZShxdWVzdGlvbiA9IGdzdWIoIlxcLCAuKiQiLCAiIFxcWy4uLlxcXSIsIHF1ZXN0aW9uKSkKZF9jaF9jaGlsZHJlbiA8LSByZWFkX2NzdigiLi4vZGF0YS9kX2NoX2NoaWxkcmVuLmNzdiIpICU+JQogIGZpbHRlcih0YXJnZXQgJWluJSBsZXZlbHNfdGFyZ2V0X3VuaXYsIHF1ZXN0aW9uX2NhdCA9PSAidW5pdmVyc2FsIikgJT4lCiAgbXV0YXRlKHF1ZXN0aW9uID0gZ3N1YigiXFwsIC4qJCIsICIgXFxbLi4uXFxdIiwgcXVlc3Rpb24pKQpkX3Z0X2NoaWxkcmVuIDwtIHJlYWRfY3N2KCIuLi9kYXRhL2RfdnRfY2hpbGRyZW4uY3N2IikgJT4lCiAgZmlsdGVyKHRhcmdldCAlaW4lIGxldmVsc190YXJnZXRfdW5pdiwgcXVlc3Rpb25fY2F0ID09ICJ1bml2ZXJzYWwiKSAlPiUKICBtdXRhdGUocXVlc3Rpb24gPSBnc3ViKCJcXCwgLiokIiwgIiBcXFsuLi5cXF0iLCBxdWVzdGlvbikpICU+JQogICMgZmlsdGVyIG91dCBwYXJ0aWNpcGFudHMgb3V0c2lkZSBvZiB0aGUgYWdlIHJhbmdlCiAgZmlsdGVyKChhZ2UgPj0gNiAmIGFnZSA8PSAxMikgfCBpcy5uYShhZ2UpKQpgYGAKCmBgYHtyIHdpZGV9CiMgbWFrZSB3aWRlLWZvcm0gZGF0YXNldHMgZm9yIEVGQTogYWR1bHRzCmRfdXNfYWR1bHRzX3cgPC0gd2lkZV9kZl9mdW4oZF91c19hZHVsdHMpCmRfZ2hfYWR1bHRzX3cgPC0gd2lkZV9kZl9mdW4oZF9naF9hZHVsdHMpCmRfdGhfYWR1bHRzX3cgPC0gd2lkZV9kZl9mdW4oZF90aF9hZHVsdHMpCmRfY2hfYWR1bHRzX3cgPC0gd2lkZV9kZl9mdW4oZF9jaF9hZHVsdHMpCmRfdnRfYWR1bHRzX3cgPC0gd2lkZV9kZl9mdW4oZF92dF9hZHVsdHMpCgojIG1ha2Ugd2lkZS1mb3JtIGRhdGFzZXRzIGZvciBFRkE6IGNoaWxkcmVuCmRfdXNfY2hpbGRyZW5fdyA8LSB3aWRlX2RmX2Z1bihkX3VzX2NoaWxkcmVuKQpkX2doX2NoaWxkcmVuX3cgPC0gd2lkZV9kZl9mdW4oZF9naF9jaGlsZHJlbikKIyBkX2doX2VuZ19jaGlsZHJlbl93IDwtIHdpZGVfZGZfZnVuKGRfZ2hfZW5nX2NoaWxkcmVuKQpkX3RoX2NoaWxkcmVuX3cgPC0gd2lkZV9kZl9mdW4oZF90aF9jaGlsZHJlbikKZF9jaF9jaGlsZHJlbl93IDwtIHdpZGVfZGZfZnVuKGRfY2hfY2hpbGRyZW4pCmRfdnRfY2hpbGRyZW5fdyA8LSB3aWRlX2RmX2Z1bihkX3Z0X2NoaWxkcmVuKQpgYGAKCgojIERlbW9ncmFwaGljIG1hdGNoaW5nCgojIyBHZW5kZXIvc2V4CgpgYGB7cn0KZ2VuZGVyX2NvdW50X2FkdWx0cyA8LSBiaW5kX3Jvd3MoCiAgZF91c19hZHVsdHMgJT4lIGRpc3RpbmN0KGNvdW50cnksIHN1YmpfaWQsIGdlbmRlciksCiAgZF9naF9hZHVsdHMgJT4lIGRpc3RpbmN0KGNvdW50cnksIHN1YmpfaWQsIGdlbmRlciksCiAgZF90aF9hZHVsdHMgJT4lIGRpc3RpbmN0KGNvdW50cnksIHN1YmpfaWQsIGdlbmRlciksCiAgZF9jaF9hZHVsdHMgJT4lIGRpc3RpbmN0KGNvdW50cnksIHN1YmpfaWQsIGdlbmRlciksCiAgZF92dF9hZHVsdHMgJT4lIGRpc3RpbmN0KGNvdW50cnksIHN1YmpfaWQsIGdlbmRlcikpICU+JSAKICBjb3VudChjb3VudHJ5LCBnZW5kZXIpICU+JQogIHNwcmVhZChnZW5kZXIsIG4pICU+JQogIG11dGF0ZShjb3VudHJ5ID0gZmFjdG9yKGNvdW50cnksIGxldmVsc19jb3VudHJ5KSkgJT4lCiAgYXJyYW5nZShjb3VudHJ5KQpnZW5kZXJfY291bnRfYWR1bHRzCgpnZW5kZXJfY291bnRfY2hpbGRyZW4gPC0gYmluZF9yb3dzKAogIGRfdXNfY2hpbGRyZW4gJT4lIGRpc3RpbmN0KGNvdW50cnksIHN1YmpfaWQsIGdlbmRlciksCiAgZF9naF9jaGlsZHJlbiAlPiUgZGlzdGluY3QoY291bnRyeSwgc3Vial9pZCwgZ2VuZGVyKSwKICBkX3RoX2NoaWxkcmVuICU+JSBkaXN0aW5jdChjb3VudHJ5LCBzdWJqX2lkLCBnZW5kZXIpLAogIGRfY2hfY2hpbGRyZW4gJT4lIGRpc3RpbmN0KGNvdW50cnksIHN1YmpfaWQsIGdlbmRlciksCiAgZF92dF9jaGlsZHJlbiAlPiUgZGlzdGluY3QoY291bnRyeSwgc3Vial9pZCwgZ2VuZGVyKSkgJT4lIAogIGNvdW50KGNvdW50cnksIGdlbmRlcikgJT4lCiAgc3ByZWFkKGdlbmRlciwgbikgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBmYWN0b3IoY291bnRyeSwgbGV2ZWxzX2NvdW50cnkpKSAlPiUKICBhcnJhbmdlKGNvdW50cnkpCmdlbmRlcl9jb3VudF9jaGlsZHJlbgpgYGAKCmBgYHtyfQojIGdoYW5haWFuIGFkdWx0czogd29tZW4gb25seQpkX2doX2FkdWx0c193X2YgPC0gZF9naF9hZHVsdHNfdyAlPiUKICByb3duYW1lc190b19jb2x1bW4oInN1YmpfaWQiKSAlPiUKICBsZWZ0X2pvaW4oZF9naF9hZHVsdHMgJT4lCiAgICAgICAgICAgICAgZGlzdGluY3Qoc3Vial9pZCwgZ2VuZGVyKSkgJT4lCiAgZmlsdGVyKGdlbmRlciA9PSAiZmVtYWxlIikgJT4lCiAgc2VsZWN0KC1nZW5kZXIpICU+JQogIGNvbHVtbl90b19yb3duYW1lcygic3Vial9pZCIpCgpyZXRlbl9mdW5fcGFyKGRfZ2hfYWR1bHRzX3dfZikKaGVhdG1hcF9mdW4oZmFfZnVuKGRfZ2hfYWR1bHRzX3dfZiwgbiA9IDMsIGNob3Nlbl9yb3QgPSAib2JsaW1pbiIpKQpgYGAKCmBgYHtyfQojIHRoYWkgYWR1bHRzOiB3b21lbiBvbmx5CmRfdGhfYWR1bHRzX3dfZiA8LSBkX3RoX2FkdWx0c193ICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigic3Vial9pZCIpICU+JQogIGxlZnRfam9pbihkX3RoX2FkdWx0cyAlPiUKICAgICAgICAgICAgICBkaXN0aW5jdChzdWJqX2lkLCBnZW5kZXIpKSAlPiUKICBmaWx0ZXIoZ2VuZGVyID09ICJmZW1hbGUiKSAlPiUKICBzZWxlY3QoLWdlbmRlcikgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKCJzdWJqX2lkIikKCnJldGVuX2Z1bl9wYXIoZF90aF9hZHVsdHNfd19mKQpoZWF0bWFwX2Z1bihmYV9mdW4oZF90aF9hZHVsdHNfd19mLCBuID0gMywgY2hvc2VuX3JvdCA9ICJvYmxpbWluIikpCmBgYAoKYGBge3J9CiMgbmktdmFudWF0dSBhZHVsdHM6IHdvbWVuIG9ubHkKZF92dF9hZHVsdHNfd19mIDwtIGRfdnRfYWR1bHRzX3cgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJqX2lkIikgJT4lCiAgbGVmdF9qb2luKGRfdnRfYWR1bHRzICU+JQogICAgICAgICAgICAgIGRpc3RpbmN0KHN1YmpfaWQsIGdlbmRlcikpICU+JQogIGZpbHRlcihnZW5kZXIgPT0gImZlbWFsZSIpICU+JQogIHNlbGVjdCgtZ2VuZGVyKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXMoInN1YmpfaWQiKQoKcmV0ZW5fZnVuX3BhcihkX3Z0X2FkdWx0c193X2YpCmhlYXRtYXBfZnVuKGZhX2Z1bihkX3Z0X2FkdWx0c193X2YsIG4gPSAyLCBjaG9zZW5fcm90ID0gIm9ibGltaW4iKSkKCmBgYAoKCiMjIEFnZQoKYGBge3J9CmFnZV9hZHVsdHMgPC0gYmluZF9yb3dzKAogIGRfdXNfYWR1bHRzICU+JSBkaXN0aW5jdChjb3VudHJ5LCBzdWJqX2lkLCBhZ2UpLAogIGRfZ2hfYWR1bHRzICU+JSBkaXN0aW5jdChjb3VudHJ5LCBzdWJqX2lkLCBhZ2UpLAogIGRfdGhfYWR1bHRzICU+JSBkaXN0aW5jdChjb3VudHJ5LCBzdWJqX2lkLCBhZ2UpLAogIGRfY2hfYWR1bHRzICU+JSBkaXN0aW5jdChjb3VudHJ5LCBzdWJqX2lkLCBhZ2UpLAogIGRfdnRfYWR1bHRzICU+JSBkaXN0aW5jdChjb3VudHJ5LCBzdWJqX2lkLCBhZ2UpKSAlPiUKICBtdXRhdGUoY291bnRyeSA9IGZhY3Rvcihjb3VudHJ5LCBsZXZlbHMgPSBsZXZlbHNfY291bnRyeSkpCmBgYAoKYGBge3J9CmFnZV9hZHVsdHMgJT4lCiAgZ2dwbG90KGFlcyh4ID0gYWdlLCBmaWxsID0gY291bnRyeSwgY29sb3IgPSBjb3VudHJ5KSkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoY291bnRyeSkpICsKICBnZW9tX2hpc3RvZ3JhbShhbHBoYSA9IDAuMiwgYmlud2lkdGggPSAxKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMDAsIDEwKSkgKyAKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIsIGFlc3RoZXRpY3MgPSBjKCJjb2xvciIsICJmaWxsIikpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAxNywgbHR5ID0gMikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDY1LCBsdHkgPSAyKQpgYGAKCmBgYHtyfQphZ2VfYWR1bHRzICU+JQogIGdncGxvdChhZXMoeCA9IGFnZSwgZmlsbCA9IGNvdW50cnksIGNvbG9yID0gY291bnRyeSkpICsKICAjIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoY291bnRyeSkpICsKICBnZW9tX2RlbnNpdHkoYWxwaGEgPSAwLjIpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMDAsIDEwKSkgKyAKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIiwgYWVzdGhldGljcyA9IGMoImNvbG9yIiwgImZpbGwiKSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDE3LCBsdHkgPSAyKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gNjUsIGx0eSA9IDIpCmBgYAoKYGBge3J9CmJpbmRfcm93cygKICBkX3VzX2FkdWx0cyAlPiUgZGlzdGluY3QoY291bnRyeSwgc3Vial9pZCwgYWdlKSwKICBkX2doX2FkdWx0cyAlPiUgZGlzdGluY3QoY291bnRyeSwgc3Vial9pZCwgYWdlKSwKICBkX3RoX2FkdWx0cyAlPiUgZGlzdGluY3QoY291bnRyeSwgc3Vial9pZCwgYWdlKSwKICBkX2NoX2FkdWx0cyAlPiUgZGlzdGluY3QoY291bnRyeSwgc3Vial9pZCwgYWdlKSwKICBkX3Z0X2FkdWx0cyAlPiUgZGlzdGluY3QoY291bnRyeSwgc3Vial9pZCwgYWdlKSkgJT4lCiAgZmlsdGVyKGlzLm5hKGFnZSkgfCAKICAgICAgICAgICAoYWdlID49IDE3ICYgYWdlIDw9IDY1KSkgJT4lCiAgY291bnQoY291bnRyeSkgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBmYWN0b3IoY291bnRyeSwgbGV2ZWxzID0gbGV2ZWxzX2NvdW50cnkpKSAlPiUKICBhcnJhbmdlKGNvdW50cnkpCmBgYAoKYGBge3J9CiMgZ2VuZGVyIGNvdW50cyBhZnRlciBhZ2UgZmlsdGVyCmdlbmRlcl9jb3VudF9hZHVsdHMgPC0gYmluZF9yb3dzKAogIGRfdXNfYWR1bHRzICU+JSBkaXN0aW5jdChjb3VudHJ5LCBzdWJqX2lkLCBnZW5kZXIsIGFnZSksCiAgZF9naF9hZHVsdHMgJT4lIGRpc3RpbmN0KGNvdW50cnksIHN1YmpfaWQsIGdlbmRlciwgYWdlKSwKICBkX3RoX2FkdWx0cyAlPiUgZGlzdGluY3QoY291bnRyeSwgc3Vial9pZCwgZ2VuZGVyLCBhZ2UpLAogIGRfY2hfYWR1bHRzICU+JSBkaXN0aW5jdChjb3VudHJ5LCBzdWJqX2lkLCBnZW5kZXIsIGFnZSksCiAgZF92dF9hZHVsdHMgJT4lIGRpc3RpbmN0KGNvdW50cnksIHN1YmpfaWQsIGdlbmRlciwgYWdlKSkgJT4lCiAgZmlsdGVyKGFnZSA+PSAxNywgYWdlIDw9IDY1KSAlPiUKICBjb3VudChjb3VudHJ5LCBnZW5kZXIpICU+JQogIHNwcmVhZChnZW5kZXIsIG4pICU+JQogIG11dGF0ZShjb3VudHJ5ID0gZmFjdG9yKGNvdW50cnksIGxldmVscyA9IGxldmVsc19jb3VudHJ5KSkgJT4lCiAgYXJyYW5nZShjb3VudHJ5KQpnZW5kZXJfY291bnRfYWR1bHRzCmBgYAoKIyMgTWF0Y2hpbmcKCmBgYHtyfQpkZW1vYmFsX2Z1biA8LSBmdW5jdGlvbihkZiwgcmVmX2RmID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgbWluX2FnZSA9IE5BX3JlYWxfLCBtYXhfYWdlID0gTkFfcmVhbF8sCiAgICAgICAgICAgICAgICAgICAgICAgIG5fZmVtYWxlID0gTkFfcmVhbF8sIG5fbWFsZSA9IE5BX3JlYWxfKSB7CiAgCiAgaWYgKGlzLm51bGwocmVmX2RmKSkgewogICAgcmVmX2RmIDwtIGRmCiAgfQogIAogIGlmICghaXMubmEobWluX2FnZSkpIHsKICAgIHJlZl9kZiA8LSByZWZfZGYgJT4lIGZpbHRlcihhZ2UgPj0gbWluX2FnZSB8IGlzLm5hKGFnZSkpCiAgfQogIAogIGlmICghaXMubmEobWF4X2FnZSkpIHsKICAgIHJlZl9kZiA8LSByZWZfZGYgJT4lIGZpbHRlcihhZ2UgPD0gbWF4X2FnZSB8IGlzLm5hKGFnZSkpCiAgfQogIAogIAogIGlmICghInN1YmpfaWQiICVpbiUgbmFtZXMoZGYpKSB7CiAgICAKICAgIGRmIDwtIGRmICU+JQogICAgICByb3duYW1lc190b19jb2x1bW4oInN1YmpfaWQiKQogICAgCiAgICB1bmRvX3Jvd25hbWVzIDwtIFQKICAgIAogIH0gZWxzZSB7CiAgICAKICAgIHVuZG9fcm93bmFtZXMgPC0gRgogIH0KCiAgZmVtYWxlX3N1YmpfaWQgPC0gcmVmX2RmICU+JQogICAgZmlsdGVyKGdlbmRlciA9PSAiZmVtYWxlIikgJT4lCiAgICBkaXN0aW5jdChzdWJqX2lkKQogIAogIGlmICghaXMubmEobl9mZW1hbGUpKSB7CiAgICBmZW1hbGVfc3Vial9pZCA8LSBmZW1hbGVfc3Vial9pZCAlPiUgc2FtcGxlX24obl9mZW1hbGUsIHJlcGxhY2UgPSBGKQogIH0KICAKICBtYWxlX3N1YmpfaWQgPC0gcmVmX2RmICU+JQogICAgZmlsdGVyKGdlbmRlciA9PSAibWFsZSIpICU+JQogICAgZGlzdGluY3Qoc3Vial9pZCkKICAKICBpZiAoIWlzLm5hKG5fbWFsZSkpIHsKICAgIG1hbGVfc3Vial9pZCA8LSBtYWxlX3N1YmpfaWQgJT4lIHNhbXBsZV9uKG5fbWFsZSwgcmVwbGFjZSA9IEYpCiAgfQogIAogIHJlcyA8LSBkZiAlPiUKICAgIGZpbHRlcihzdWJqX2lkICVpbiUgZmVtYWxlX3N1YmpfaWQkc3Vial9pZCB8CiAgICAgICAgICAgICBzdWJqX2lkICVpbiUgbWFsZV9zdWJqX2lkJHN1YmpfaWQpCiAgCiAgaWYgKHVuZG9fcm93bmFtZXMpIHsKICAgIAogICAgcmVzIDwtIHJlcyAlPiUKICAgICAgY29sdW1uX3RvX3Jvd25hbWVzKCJzdWJqX2lkIikKICAgIAogIH0KICAKICByZXR1cm4ocmVzKQp9CmBgYAoKYGBge3J9CmRfdXNfYWR1bHRzIDwtIGRlbW9iYWxfZnVuKGRfdXNfYWR1bHRzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX2FnZSA9IDE3LCBtYXhfYWdlID0gNjUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbl9mZW1hbGUgPSBtaW4oZ2VuZGVyX2NvdW50X2FkdWx0cyRmZW1hbGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5fbWFsZSA9IG1pbihnZW5kZXJfY291bnRfYWR1bHRzJG1hbGUpKQoKZF91c19hZHVsdHNfdyA8LSBkZW1vYmFsX2Z1bihkX3VzX2FkdWx0c193LCBkX3VzX2FkdWx0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fYWdlID0gMTcsIG1heF9hZ2UgPSA2NSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5fZmVtYWxlID0gbWluKGdlbmRlcl9jb3VudF9hZHVsdHMkZmVtYWxlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5fbWFsZSA9IG1pbihnZW5kZXJfY291bnRfYWR1bHRzJG1hbGUpKQoKZF9naF9hZHVsdHMgPC0gZGVtb2JhbF9mdW4oZF9naF9hZHVsdHMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fYWdlID0gMTcsIG1heF9hZ2UgPSA2NSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBuX2ZlbWFsZSA9IG1pbihnZW5kZXJfY291bnRfYWR1bHRzJGZlbWFsZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbl9tYWxlID0gbWluKGdlbmRlcl9jb3VudF9hZHVsdHMkbWFsZSkpCgpkX2doX2FkdWx0c193IDwtIGRlbW9iYWxfZnVuKGRfZ2hfYWR1bHRzX3csIGRfZ2hfYWR1bHRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9hZ2UgPSAxNywgbWF4X2FnZSA9IDY1KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbl9mZW1hbGUgPSBtaW4oZ2VuZGVyX2NvdW50X2FkdWx0cyRmZW1hbGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbl9tYWxlID0gbWluKGdlbmRlcl9jb3VudF9hZHVsdHMkbWFsZSkpCgpkX3RoX2FkdWx0cyA8LSBkZW1vYmFsX2Z1bihkX3RoX2FkdWx0cywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9hZ2UgPSAxNywgbWF4X2FnZSA9IDY1KQogICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5fZmVtYWxlID0gbWluKGdlbmRlcl9jb3VudF9hZHVsdHMkZmVtYWxlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBuX21hbGUgPSBtaW4oZ2VuZGVyX2NvdW50X2FkdWx0cyRtYWxlKSkKCmRfdGhfYWR1bHRzX3cgPC0gZGVtb2JhbF9mdW4oZF90aF9hZHVsdHNfdywgZF90aF9hZHVsdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX2FnZSA9IDE3LCBtYXhfYWdlID0gNjUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBuX2ZlbWFsZSA9IG1pbihnZW5kZXJfY291bnRfYWR1bHRzJGZlbWFsZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBuX21hbGUgPSBtaW4oZ2VuZGVyX2NvdW50X2FkdWx0cyRtYWxlKSkKCmRfY2hfYWR1bHRzIDwtIGRlbW9iYWxfZnVuKGRfY2hfYWR1bHRzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX2FnZSA9IDE3LCBtYXhfYWdlID0gNjUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbl9mZW1hbGUgPSBtaW4oZ2VuZGVyX2NvdW50X2FkdWx0cyRmZW1hbGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5fbWFsZSA9IG1pbihnZW5kZXJfY291bnRfYWR1bHRzJG1hbGUpKQoKZF9jaF9hZHVsdHNfdyA8LSBkZW1vYmFsX2Z1bihkX2NoX2FkdWx0c193LCBkX2NoX2FkdWx0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fYWdlID0gMTcsIG1heF9hZ2UgPSA2NSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5fZmVtYWxlID0gbWluKGdlbmRlcl9jb3VudF9hZHVsdHMkZmVtYWxlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5fbWFsZSA9IG1pbihnZW5kZXJfY291bnRfYWR1bHRzJG1hbGUpKQoKZF92dF9hZHVsdHMgPC0gZGVtb2JhbF9mdW4oZF92dF9hZHVsdHMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fYWdlID0gMTcsIG1heF9hZ2UgPSA2NSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBuX2ZlbWFsZSA9IG1pbihnZW5kZXJfY291bnRfYWR1bHRzJGZlbWFsZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbl9tYWxlID0gbWluKGdlbmRlcl9jb3VudF9hZHVsdHMkbWFsZSkpCgpkX3Z0X2FkdWx0c193IDwtIGRlbW9iYWxfZnVuKGRfdnRfYWR1bHRzX3csIGRfdnRfYWR1bHRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9hZ2UgPSAxNywgbWF4X2FnZSA9IDY1KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbl9mZW1hbGUgPSBtaW4oZ2VuZGVyX2NvdW50X2FkdWx0cyRmZW1hbGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbl9tYWxlID0gbWluKGdlbmRlcl9jb3VudF9hZHVsdHMkbWFsZSkpCmBgYAoKYGBge3J9CiMgZF91c19jaGlsZHJlbiA8LSBkZW1vYmFsX2Z1bihkX3VzX2NoaWxkcmVuLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbl9mZW1hbGUgPSBtaW4oZ2VuZGVyX2NvdW50X2NoaWxkcmVuJGZlbWFsZSksCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5fbWFsZSA9IG1pbihnZW5kZXJfY291bnRfY2hpbGRyZW4kbWFsZSkpCiMgCiMgZF91c19jaGlsZHJlbl93IDwtIGRlbW9iYWxfZnVuKGRfdXNfY2hpbGRyZW5fdywgZF91c19jaGlsZHJlbiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuX2ZlbWFsZSA9IG1pbihnZW5kZXJfY291bnRfY2hpbGRyZW4kZmVtYWxlKSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuX21hbGUgPSBtaW4oZ2VuZGVyX2NvdW50X2NoaWxkcmVuJG1hbGUpKQojIAojIGRfZ2hfY2hpbGRyZW4gPC0gZGVtb2JhbF9mdW4oZF9naF9jaGlsZHJlbiwgCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5fZmVtYWxlID0gbWluKGdlbmRlcl9jb3VudF9jaGlsZHJlbiRmZW1hbGUpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuX21hbGUgPSBtaW4oZ2VuZGVyX2NvdW50X2NoaWxkcmVuJG1hbGUpKQojIAojIGRfZ2hfY2hpbGRyZW5fdyA8LSBkZW1vYmFsX2Z1bihkX2doX2NoaWxkcmVuX3csIGRfZ2hfY2hpbGRyZW4sCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbl9mZW1hbGUgPSBtaW4oZ2VuZGVyX2NvdW50X2NoaWxkcmVuJGZlbWFsZSksCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbl9tYWxlID0gbWluKGdlbmRlcl9jb3VudF9jaGlsZHJlbiRtYWxlKSkKIyAKIyBkX3RoX2NoaWxkcmVuIDwtIGRlbW9iYWxfZnVuKGRfdGhfY2hpbGRyZW4sIAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuX2ZlbWFsZSA9IG1pbihnZW5kZXJfY291bnRfY2hpbGRyZW4kZmVtYWxlKSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbl9tYWxlID0gbWluKGdlbmRlcl9jb3VudF9jaGlsZHJlbiRtYWxlKSkKIyAKIyBkX3RoX2NoaWxkcmVuX3cgPC0gZGVtb2JhbF9mdW4oZF90aF9jaGlsZHJlbl93LCBkX3RoX2NoaWxkcmVuLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5fZmVtYWxlID0gbWluKGdlbmRlcl9jb3VudF9jaGlsZHJlbiRmZW1hbGUpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5fbWFsZSA9IG1pbihnZW5kZXJfY291bnRfY2hpbGRyZW4kbWFsZSkpCiMgCiMgZF9jaF9jaGlsZHJlbiA8LSBkZW1vYmFsX2Z1bihkX2NoX2NoaWxkcmVuLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbl9mZW1hbGUgPSBtaW4oZ2VuZGVyX2NvdW50X2NoaWxkcmVuJGZlbWFsZSksCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5fbWFsZSA9IG1pbihnZW5kZXJfY291bnRfY2hpbGRyZW4kbWFsZSkpCiMgCiMgZF9jaF9jaGlsZHJlbl93IDwtIGRlbW9iYWxfZnVuKGRfY2hfY2hpbGRyZW5fdywgZF9jaF9jaGlsZHJlbiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuX2ZlbWFsZSA9IG1pbihnZW5kZXJfY291bnRfY2hpbGRyZW4kZmVtYWxlKSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuX21hbGUgPSBtaW4oZ2VuZGVyX2NvdW50X2NoaWxkcmVuJG1hbGUpKQojIAojIGRfdnRfY2hpbGRyZW4gPC0gZGVtb2JhbF9mdW4oZF92dF9jaGlsZHJlbiwgCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5fZmVtYWxlID0gbWluKGdlbmRlcl9jb3VudF9jaGlsZHJlbiRmZW1hbGUpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuX21hbGUgPSBtaW4oZ2VuZGVyX2NvdW50X2NoaWxkcmVuJG1hbGUpKQojIAojIGRfdnRfY2hpbGRyZW5fdyA8LSBkZW1vYmFsX2Z1bihkX3Z0X2NoaWxkcmVuX3csIGRfdnRfY2hpbGRyZW4sCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbl9mZW1hbGUgPSBtaW4oZ2VuZGVyX2NvdW50X2NoaWxkcmVuJGZlbWFsZSksCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbl9tYWxlID0gbWluKGdlbmRlcl9jb3VudF9jaGlsZHJlbiRtYWxlKSkKYGBgCgoKCiMgQWR1bHRzCgojIyBTYW1wbGVzCgpgYGB7ciBzYW1wbGVzIGFkdWx0c30KYmluZF9yb3dzKGRfdXNfYWR1bHRzLCBkX2doX2FkdWx0cywgZF90aF9hZHVsdHMsIGRfY2hfYWR1bHRzLCBkX3Z0X2FkdWx0cykgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBmYWN0b3IoY291bnRyeSwgbGV2ZWxzID0gbGV2ZWxzX2NvdW50cnkpKSAlPiUKICBkaXN0aW5jdChjb3VudHJ5LCBzdWJqX2lkKSAlPiUKICBjb3VudChjb3VudHJ5KSAlPiUKICBqYW5pdG9yOjphZG9ybl90b3RhbHMoKQpgYGAKCmBgYHtyfQpiaW5kX3Jvd3MoZF91c19hZHVsdHMsIGRfZ2hfYWR1bHRzLCBkX3RoX2FkdWx0cywgZF9jaF9hZHVsdHMsIGRfdnRfYWR1bHRzKSAlPiUKICBtdXRhdGUoY291bnRyeSA9IGZhY3Rvcihjb3VudHJ5LCBsZXZlbHMgPSBsZXZlbHNfY291bnRyeSkpICU+JQogIGRpc3RpbmN0KGNvdW50cnksIHN1YmpfaWQsIGFnZSkgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKGFnZSwgbmEucm0gPSBUKSwKICAgICAgICAgICAgbWVkaWFuID0gbWVkaWFuKGFnZSwgbmEucm0gPSBUKSkKYGBgCgpgYGB7cn0KYmluZF9yb3dzKGRfdXNfYWR1bHRzLCBkX2doX2FkdWx0cywgZF90aF9hZHVsdHMsIGRfY2hfYWR1bHRzLCBkX3Z0X2FkdWx0cykgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBmYWN0b3IoY291bnRyeSwgbGV2ZWxzID0gbGV2ZWxzX2NvdW50cnkpKSAlPiUKICBkaXN0aW5jdChjb3VudHJ5LCBzdWJqX2lkLCBnZW5kZXIpICU+JQogIGNvdW50KGNvdW50cnksIGdlbmRlcikgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgbXV0YXRlKHByb3AgPSBuL3N1bShuLCBuYS5ybSA9IFQpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgc2VsZWN0KC1uKSAlPiUKICBzcHJlYWQoZ2VuZGVyLCBwcm9wKQpgYGAKCiMjIFNjYWxlIHVzZQoKYGBge3Igc2NhbGUgdXNlIG1lYW4gb3ZlcmFsbCBhZHVsdHN9CmJpbmRfcm93cyhkX3VzX2FkdWx0cywgZF9naF9hZHVsdHMsIGRfdGhfYWR1bHRzLCBkX2NoX2FkdWx0cywgZF92dF9hZHVsdHMpICU+JQogIG11dGF0ZShjb3VudHJ5ID0gZmFjdG9yKGNvdW50cnksIGxldmVscyA9IGxldmVsc19jb3VudHJ5KSwKICAgICAgICAgcmVzcG9uc2VfY2F0ID0gcmVjb2RlX2ZhY3RvcihyZXNwb25zZV9jYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vIiA9ICJubyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImtpbmQgb2YiID0gImtpbmQgb2YiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ5ZXMiID0gInllcyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5taXNzaW5nID0gIm1pc3NpbmcgZGF0YSIpKSAlPiUKICBjb3VudChjb3VudHJ5LCByZXNwb25zZV9jYXQpICU+JQogIGNvbXBsZXRlKHJlc3BvbnNlX2NhdCwgbmVzdGluZyhjb3VudHJ5KSwgZmlsbCA9IGxpc3QobiA9IDApKSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBtdXRhdGUocHJvcCA9IG4vc3VtKG4sIG5hLnJtID0gVCkpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBzZWxlY3QoLW4pICU+JQogIHNwcmVhZChyZXNwb25zZV9jYXQsIHByb3ApICU+JQogIGphbml0b3I6OmFkb3JuX3BjdF9mb3JtYXR0aW5nKGRpZ2l0cyA9IDIpCmBgYAoKIyMgRmFjdG9yIHJldGVudGlvbjogcGFyYWxsZWwgYW5hbHlzaXMKCmBgYHtyIHBhcmFsbGVsIGRpc3QgYWR1bHRzLCBmaWcud2lkdGggPSAzLCBmaWcuYXNwID0gMC41fQojIE5PVEU6IHRoZXJlIGFwcGVhcnMgdG8gYmUgc29tZSB1bnJlbGlhYmlsaXR5L25vbi1yZXByb2R1Y2liaWxpdHkgaW4gcmVzdWx0cywgZXNwZWNpYWxseSBmb3IgdnQgYWR1bHRzLCB3aGljaCBJIGRvbid0IHVuZGVyc3RhbmQgLS0gc28gaGVyZSdzIHRoZSBkaXN0cmlidXRpb24gb3ZlciBvdXRjb21lcyBvZiBwYXJhbGxlbCBhbmFseXNpcyB3aXRoIDEwMCBpdGVyYXRpb25zLiBXZSdsbCBjaG9vc2UgdGhlIG1lZGlhbiBudW1iZXIgb2YgZmFjdG9ycy4KCmlmIChmaWxlLmV4aXN0cygiLi4vcmVzdWx0cy9wYV9vdXRjb21lc19kaXN0X2FkdWx0c19kZW1vYmFsLlJEUyIpKSB7CiAgCiAgcGFfb3V0Y29tZXNfZGlzdF9hZHVsdHMgPC0gcmVhZFJEUygiLi4vcmVzdWx0cy9wYV9vdXRjb21lc19kaXN0X2FkdWx0c19kZW1vYmFsLlJEUyIpCiAgCn0gZWxzZSB7CiAgCiAgcGFfb3V0Y29tZXNfZGlzdF9hZHVsdHMgPC0gZGF0YS5mcmFtZSh1cyA9IE5VTEwsIGdoID0gTlVMTCwgdGggPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBOVUxMLCB2dCA9IE5VTEwpCiAgCiAgc2V0LnNlZWQoNTQzMjEpCiAgbl9jb3JlcyA8LSBwYXJhbGxlbDo6ZGV0ZWN0Q29yZXMoKQogIG9wdGlvbnMobWMuY29yZXMgPSBuX2NvcmVzKQogIAogIGZvciAoaSBpbiAxOjEwMCkgewogICAgcGFfb3V0Y29tZXNfZGlzdF9hZHVsdHNbaSwgInVzIl0gPC0gZmEucGFyYWxsZWwoZF91c19hZHVsdHNfdywgcGxvdCA9IEYpJG5mYWN0CiAgICBwYV9vdXRjb21lc19kaXN0X2FkdWx0c1tpLCAiZ2giXSA8LSBmYS5wYXJhbGxlbChkX2doX2FkdWx0c193LCBwbG90ID0gRikkbmZhY3QgICAgIAogICAgcGFfb3V0Y29tZXNfZGlzdF9hZHVsdHNbaSwgInRoIl0gPC0gZmEucGFyYWxsZWwoZF90aF9hZHVsdHNfdywgcGxvdCA9IEYpJG5mYWN0CiAgICBwYV9vdXRjb21lc19kaXN0X2FkdWx0c1tpLCAiY2giXSA8LSBmYS5wYXJhbGxlbChkX2NoX2FkdWx0c193LCBwbG90ID0gRikkbmZhY3QKICAgIHBhX291dGNvbWVzX2Rpc3RfYWR1bHRzW2ksICJ2dCJdIDwtIGZhLnBhcmFsbGVsKGRfdnRfYWR1bHRzX3csIHBsb3QgPSBGKSRuZmFjdAogIH0KICAKICBzYXZlUkRTKHBhX291dGNvbWVzX2Rpc3RfYWR1bHRzLCBmaWxlID0gIi4uL3Jlc3VsdHMvcGFfb3V0Y29tZXNfZGlzdF9hZHVsdHNfZGVtb2JhbC5SRFMiKQp9CgojIHBsb3QKcGFfb3V0Y29tZXNfZGlzdF9hZHVsdHMgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJpdGVyIikgJT4lCiAgZ2F0aGVyKGNvdW50cnksIG5mYWN0LCAtaXRlcikgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBmYWN0b3IoY291bnRyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ1cyIsICJnaCIsICJ0aCIsICJjaCIsICJ2dCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGxldmVsc19jb3VudHJ5KSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gbmZhY3QpKSArCiAgZmFjZXRfZ3JpZCh+IGNvdW50cnkpICsKICBnZW9tX2JhcihzdGF0ID0gImNvdW50IikgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDEsIG1heChwYV9vdXRjb21lc19kaXN0X2FkdWx0cykgKyAxKSwKICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKDAsIDEwMCwgMSkpICsKICBsYWJzKHggPSAiTnVtYmVyIG9mIGZhY3RvcnMgc3VnZ2VzdGVkIGJ5IGZhLnBhcmFsbGVsKCkiKQpgYGAKCiMjIEV4cGxvcmF0b3J5IGZhY3RvciBhbmFseXNpcwoKYGBge3IgZWZhIGFkdWx0c30Kc2V0LnNlZWQoNTQzMjEpCgojIGRvIGV4cGxvcmF0b3J5IGZhY3RvciBhbmFseXNpczogYWR1bHRzCmVmYV91c19hZHVsdHMgPC0gZmFfZnVuKGRfdXNfYWR1bHRzX3csCiAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBtZWRpYW4ocGFfb3V0Y29tZXNfZGlzdF9hZHVsdHMkdXMpLAogICAgICAgICAgICAgICAgICAgICAgICBjaG9zZW5fbi5pdGVyID0gMTAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgY2hvc2VuX3JvdCA9ICJvYmxpbWluIikKY29sbmFtZXMoZWZhX3VzX2FkdWx0cyRsb2FkaW5ncykgPC0gcGFzdGUwKCJ1c0FEVUxUU18iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWVzKGVmYV91c19hZHVsdHMkbG9hZGluZ3MpKQoKZWZhX2doX2FkdWx0cyA8LSBmYV9mdW4oZF9naF9hZHVsdHNfdywgCiAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBtZWRpYW4ocGFfb3V0Y29tZXNfZGlzdF9hZHVsdHMkZ2gpLAogICAgICAgICAgICAgICAgICAgICAgICBjaG9zZW5fbi5pdGVyID0gMTAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgY2hvc2VuX3JvdCA9ICJvYmxpbWluIikKY29sbmFtZXMoZWZhX2doX2FkdWx0cyRsb2FkaW5ncykgPC0gcGFzdGUwKCJnaEFEVUxUU18iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWVzKGVmYV9naF9hZHVsdHMkbG9hZGluZ3MpKQoKZWZhX3RoX2FkdWx0cyA8LSBmYV9mdW4oZF90aF9hZHVsdHNfdywgCiAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBtZWRpYW4ocGFfb3V0Y29tZXNfZGlzdF9hZHVsdHMkdGgpLAogICAgICAgICAgICAgICAgICAgICAgICBjaG9zZW5fbi5pdGVyID0gMTAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgY2hvc2VuX3JvdCA9ICJvYmxpbWluIikKY29sbmFtZXMoZWZhX3RoX2FkdWx0cyRsb2FkaW5ncykgPC0gcGFzdGUwKCJ0aEFEVUxUU18iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWVzKGVmYV90aF9hZHVsdHMkbG9hZGluZ3MpKQoKZWZhX2NoX2FkdWx0cyA8LSBmYV9mdW4oZF9jaF9hZHVsdHNfdywgCiAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBtZWRpYW4ocGFfb3V0Y29tZXNfZGlzdF9hZHVsdHMkY2gpLAogICAgICAgICAgICAgICAgICAgICAgICBjaG9zZW5fbi5pdGVyID0gMTAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgY2hvc2VuX3JvdCA9ICJvYmxpbWluIikKY29sbmFtZXMoZWZhX2NoX2FkdWx0cyRsb2FkaW5ncykgPC0gcGFzdGUwKCJjaEFEVUxUU18iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWVzKGVmYV9jaF9hZHVsdHMkbG9hZGluZ3MpKQoKZWZhX3Z0X2FkdWx0cyA8LSBmYV9mdW4oZF92dF9hZHVsdHNfdywgCiAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBtZWRpYW4ocGFfb3V0Y29tZXNfZGlzdF9hZHVsdHMkdnQpLAogICAgICAgICAgICAgICAgICAgICAgICBjaG9zZW5fbi5pdGVyID0gMTAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgY2hvc2VuX3JvdCA9ICJvYmxpbWluIikKY29sbmFtZXMoZWZhX3Z0X2FkdWx0cyRsb2FkaW5ncykgPC0gcGFzdGUwKCJ2dEFEVUxUU18iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWVzKGVmYV92dF9hZHVsdHMkbG9hZGluZ3MpKQpgYGAKCmBgYHtyIGZhY3RvciBuYW1lcyBhZHVsdHN9CmZhY3Rvcl9uYW1lc19hZHVsdHMgPC0gZGF0YS5mcmFtZShmYWN0b3IgPSBjKGNvbG5hbWVzKGVmYV91c19hZHVsdHMkbG9hZGluZ3MpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lcyhlZmFfZ2hfYWR1bHRzJGxvYWRpbmdzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZXMoZWZhX3RoX2FkdWx0cyRsb2FkaW5ncyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWVzKGVmYV9jaF9hZHVsdHMkbG9hZGluZ3MpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lcyhlZmFfdnRfYWR1bHRzJGxvYWRpbmdzKSkpICU+JQogIG11dGF0ZShhZ2VfZ3JvdXAgPSAiYWR1bHRzIikgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBjYXNlX3doZW4oZ3JlcGwoIl51cyIsIGZhY3RvcikgfiAiVVMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCJeZ2giLCBmYWN0b3IpIH4gIkdoYW5hIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbCgiXnRoIiwgZmFjdG9yKSB+ICJUaGFpbGFuZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoIl5jaCIsIGZhY3RvcikgfiAiQ2hpbmEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCJednQiLCBmYWN0b3IpIH4gIlZhbnVhdHUiKSwKICAgICAgICAgY291bnRyeSA9IGZhY3Rvcihjb3VudHJ5LCBsZXZlbHNfY291bnRyeSkpICU+JQogIG11dGF0ZShmYWN0b3JfbmFtZSA9IGdzdWIoIl51cyIsICJVUyAiLCBmYWN0b3IpLAogICAgICAgICBmYWN0b3JfbmFtZSA9IGdzdWIoIl5naCIsICJHaC4gIiwgZmFjdG9yX25hbWUpLAogICAgICAgICBmYWN0b3JfbmFtZSA9IGdzdWIoIl50aCIsICJUaC4gIiwgZmFjdG9yX25hbWUpLAogICAgICAgICBmYWN0b3JfbmFtZSA9IGdzdWIoIl5jaCIsICJDaC4gIiwgZmFjdG9yX25hbWUpLAogICAgICAgICBmYWN0b3JfbmFtZSA9IGdzdWIoIl52dCIsICJWYS4gIiwgZmFjdG9yX25hbWUpLAogICAgICAgICBmYWN0b3JfbmFtZSA9IGdzdWIoIkFEVUxUUyIsICJhZHVsdHMiLCBmYWN0b3JfbmFtZSksCiAgICAgICAgIGZhY3Rvcl9uYW1lID0gZ3N1YigiX0YiLCAiIEZhY3RvciAiLCBmYWN0b3JfbmFtZSkpICU+JQogIG11dGF0ZShmYWN0b3JfZGVzY3JpcHQgPSByZWNvZGUoZmFjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNBRFVMVFNfRjEgPSAiQm9keSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c0FEVUxUU19GMiA9ICJIZWFydCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c0FEVUxUU19GMyA9ICJNaW5kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdoQURVTFRTX0YxID0gIklubmVyIHNwaGVyZSAobWluZC1saWtlKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaEFEVUxUU19GMiA9ICJCb2R5LWxpa2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2hBRFVMVFNfRjMgPSAiSW50ZXJwZXJzb25hbCwgcmVsaWdpb3VzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoQURVTFRTX0YxID0gIkJvZHktbGlrZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aEFEVUxUU19GMiA9ICJIZWFydC1saWtlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoQURVTFRTX0YzID0gIk1pbmQtbGlrZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaEFEVUxUU19GMSA9ICJNaW5kLUhlYXJ0LWxpa2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hBRFVMVFNfRjIgPSAiQm9keS1saWtlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ0QURVTFRTX0YxID0gIkhhcm1vbnkgKG1pbmQtbGlrZSwgaGVhcnQtbGlrZSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnRBRFVMVFNfRjIgPSAiU2luIChib2R5LWxpa2UpIiksCiAgICAgICAgIGZhY3Rvcl9sYWJkZXNjcmlwdCA9IHBhc3RlKGdzdWIoIi4qX0YiLCAiRiIsIGZhY3RvciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9kZXNjcmlwdCwgc2VwID0gIjogIikpCmBgYAoKIyMgRmFjdG9yIGxvYWRpbmdzCgpgYGB7ciBvcmRlciBhZHVsdHN9CiMgb3JkZXIgY2FwYWNpdGllczogYWR1bHRzCm9yZGVyX3VzX2FkdWx0cyA8LSBmYS5zb3J0KGVmYV91c19hZHVsdHMpJGxvYWRpbmdzW10gJT4lIHJvd25hbWVzKCkKb3JkZXJfZ2hfYWR1bHRzIDwtIGZhLnNvcnQoZWZhX2doX2FkdWx0cykkbG9hZGluZ3NbXSAlPiUgcm93bmFtZXMoKQpvcmRlcl90aF9hZHVsdHMgPC0gZmEuc29ydChlZmFfdGhfYWR1bHRzKSRsb2FkaW5nc1tdICU+JSByb3duYW1lcygpCm9yZGVyX2NoX2FkdWx0cyA8LSBmYS5zb3J0KGVmYV9jaF9hZHVsdHMpJGxvYWRpbmdzW10gJT4lIHJvd25hbWVzKCkKb3JkZXJfdnRfYWR1bHRzIDwtIGZhLnNvcnQoZWZhX3Z0X2FkdWx0cykkbG9hZGluZ3NbXSAlPiUgcm93bmFtZXMoKQpgYGAKCmBgYHtyIGxvYWRpbmdzIGFkdWx0c30KIyBjb21waWxlIGxvYWRpbmdzOiBhZHVsdHMKbG9hZGluZ3NfYWR1bHRzIDwtIGJpbmRfcm93cygKICBsb2FkaW5nc19mdW4oZWZhX3VzX2FkdWx0cykgJT4lIG11dGF0ZShjb3VudHJ5ID0gIlVTIiksCiAgbG9hZGluZ3NfZnVuKGVmYV9naF9hZHVsdHMpICU+JSBtdXRhdGUoY291bnRyeSA9ICJHaGFuYSIpLAogIGxvYWRpbmdzX2Z1bihlZmFfdGhfYWR1bHRzKSAlPiUgbXV0YXRlKGNvdW50cnkgPSAiVGhhaWxhbmQiKSwKICBsb2FkaW5nc19mdW4oZWZhX2NoX2FkdWx0cykgJT4lIG11dGF0ZShjb3VudHJ5ID0gIkNoaW5hIiksCiAgbG9hZGluZ3NfZnVuKGVmYV92dF9hZHVsdHMpICU+JSBtdXRhdGUoY291bnRyeSA9ICJWYW51YXR1IikpICU+JQogIG11dGF0ZShjb3VudHJ5ID0gZmFjdG9yKGNvdW50cnksIGxldmVscyA9IGxldmVsc19jb3VudHJ5KSwKICAgICAgICAgY2FwYWNpdHlfb3JkX3VzID0gZmFjdG9yKGNhcGFjaXR5LCBsZXZlbHMgPSBvcmRlcl91c19hZHVsdHMpLAogICAgICAgICBjYXBhY2l0eV9vcmRfZ2ggPSBmYWN0b3IoY2FwYWNpdHksIGxldmVscyA9IG9yZGVyX2doX2FkdWx0cyksCiAgICAgICAgIGNhcGFjaXR5X29yZF90aCA9IGZhY3RvcihjYXBhY2l0eSwgbGV2ZWxzID0gb3JkZXJfdGhfYWR1bHRzKSwKICAgICAgICAgY2FwYWNpdHlfb3JkX2NoID0gZmFjdG9yKGNhcGFjaXR5LCBsZXZlbHMgPSBvcmRlcl9jaF9hZHVsdHMpLAogICAgICAgICBjYXBhY2l0eV9vcmRfdnQgPSBmYWN0b3IoY2FwYWNpdHksIGxldmVscyA9IG9yZGVyX3Z0X2FkdWx0cykpICU+JQogIGFycmFuZ2UoY291bnRyeSwgZmFjdG9yLCBkZXNjKGFicyhsb2FkaW5nKSksIGNhcGFjaXR5KSAlPiUKICBtdXRhdGUob3JkZXIgPSAxOm5yb3coLikpICU+JQogIGxlZnRfam9pbihmYWN0b3JfbmFtZXNfYWR1bHRzKQpgYGAKCmBgYHtyIGhlYXRtYXBzIGJ5IHNpdGUgYWR1bHRzLCBmaWcud2lkdGggPSAxNSwgZmlnLmFzcCA9IDAuMjV9CnBsb3RfZ3JpZChoZWF0bWFwX2Z1bihlZmFfdXNfYWR1bHRzLCAKICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGZhY3Rvcl9uYW1lc19hZHVsdHMgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihjb3VudHJ5ID09ICJVUyIpICU+JQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoZmFjdG9yX2xhYmRlc2NyaXB0KSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KCkpICsgCiAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogICAgICAgICAgICBsYWJzKHRpdGxlID0gIlVTOiBhZHVsdHMiKSwKICAgICAgICAgIGhlYXRtYXBfZnVuKGVmYV9naF9hZHVsdHMsCiAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBmYWN0b3JfbmFtZXNfYWR1bHRzICU+JQogICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoY291bnRyeSA9PSAiR2hhbmEiKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KGZhY3Rvcl9sYWJkZXNjcmlwdCkgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIHVubGlzdCgpKSArIAogICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICAgICAgICAgICAgbGFicyh0aXRsZSA9ICJHSEFOQTogYWR1bHRzIiksCiAgICAgICAgICBoZWF0bWFwX2Z1bihlZmFfdGhfYWR1bHRzLAogICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX25hbWVzID0gZmFjdG9yX25hbWVzX2FkdWx0cyAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGNvdW50cnkgPT0gIlRoYWlsYW5kIikgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChmYWN0b3JfbGFiZGVzY3JpcHQpICU+JQogICAgICAgICAgICAgICAgICAgICAgICB1bmxpc3QoKSkgKyAKICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgICAgICAgICAgIGxhYnModGl0bGUgPSAiVEhBSUxBTkQ6IGFkdWx0cyIpLAogICAgICAgICAgaGVhdG1hcF9mdW4oZWZhX2NoX2FkdWx0cywKICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGZhY3Rvcl9uYW1lc19hZHVsdHMgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihjb3VudHJ5ID09ICJDaGluYSIpICU+JQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoZmFjdG9yX2xhYmRlc2NyaXB0KSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KCkpICsgCiAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogICAgICAgICAgICBsYWJzKHRpdGxlID0gIkNISU5BOiBhZHVsdHMiKSwKICAgICAgICAgIGhlYXRtYXBfZnVuKGVmYV92dF9hZHVsdHMsCiAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBmYWN0b3JfbmFtZXNfYWR1bHRzICU+JQogICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoY291bnRyeSA9PSAiVmFudWF0dSIpICU+JQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoZmFjdG9yX2xhYmRlc2NyaXB0KSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KCkpICsgCiAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogICAgICAgICAgICBsYWJzKHRpdGxlID0gIlZBTlVBVFU6IGFkdWx0cyIpLAogICAgICAgICAgbmNvbCA9IDUpCmBgYAoKYGBge3IgaGVhdG1hcCBhZHVsdHMsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjd9CiMgbWFrZSBoZWF0bWFwIGZpZ3VyZTogYWR1bHRzCmxvYWRpbmdzX2FkdWx0cyAlPiUKICBtdXRhdGUoZmFjdG9yX251bSA9IGFzLm51bWVyaWMoZ3N1YigiLipGIiwgIiIsIGZhY3RvcikpKSAlPiUKICBtdXRhdGUoc2FtcGxlID0gcGFzdGUoY291bnRyeSwgImFkdWx0cyIsIHNlcCA9ICJcbiIpKSAlPiUKICBsZWZ0X2pvaW4oZmFjdG9yX25hbWVzX2FkdWx0cykgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBmYWN0b3IoY291bnRyeSwgbGV2ZWxzID0gbGV2ZWxzX2NvdW50cnkpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKGZhY3Rvcl9sYWJkZXNjcmlwdCwgZmFjdG9yX251bSksIAogICAgICAgICAgICAgeSA9IHJlb3JkZXIoY2FwYWNpdHksIGRlc2MoY2FwYWNpdHlfb3JkX3VzKSksCiAgICAgICAgICAgICAjIHkgPSByZW9yZGVyKGNhcGFjaXR5LCBkZXNjKGNhcGFjaXR5X29yZF9lYykpLCAKICAgICAgICAgICAgICMgeSA9IHJlb3JkZXIoY2FwYWNpdHksIGRlc2MoY2FwYWNpdHlfb3JkX2doKSksCiAgICAgICAgICAgICAjIHkgPSByZW9yZGVyKGNhcGFjaXR5LCBkZXNjKGNhcGFjaXR5X29yZF90aCkpLAogICAgICAgICAgICAgIyB5ID0gcmVvcmRlcihjYXBhY2l0eSwgZGVzYyhjYXBhY2l0eV9vcmRfY2gpKSwKICAgICAgICAgICAgICMgeSA9IHJlb3JkZXIoY2FwYWNpdHksIGRlc2MoY2FwYWNpdHlfb3JkX3Z0KSksCiAgICAgICAgICAgICBmaWxsID0gbG9hZGluZykpICsKICBmYWNldF9ncmlkKH4gcmVvcmRlcihzYW1wbGUsIGFzLm51bWVyaWMoY291bnRyeSkpLCBzY2FsZXMgPSAiZnJlZSIsIHNwYWNlID0gImZyZWUiKSArCiAgZ2VvbV90aWxlKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuMikgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSBmb3JtYXQocm91bmQobG9hZGluZywgMiksIG5zbWFsbCA9IDIpKSwgc2l6ZSA9IDMpICsKICBzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlID0gIlJkWWxCdSIsIGxpbWl0cyA9IGMoLTEsIDEpLAogICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIoYmFyaGVpZ2h0ID0gMjAsIGJhcndpZHRoID0gMC41KSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLAogICAgICAgIHBhbmVsLnNwYWNpbmcueCA9IHVuaXQoMC44LCAibGluZXMiKSwKICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCBmYWNlID0gImJvbGQiKSkgKwogIGxhYnMoeCA9IE5VTEwsIHkgPSAiQ2FwYWNpdHkiLCBmaWxsID0gIkZhY3RvclxubG9hZGluZyIpCmBgYAoKIyMgQ29uZ3J1ZW5jZQoKYGBge3IgY29uZ3J1ZW5jZSBhZHVsdHN9CmNvbmdfYWR1bHRzIDwtIGZhLmNvbmdydWVuY2UoeCA9IGxpc3QoZWZhX3VzX2FkdWx0cyRsb2FkaW5ncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmFfZ2hfYWR1bHRzJGxvYWRpbmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmYV90aF9hZHVsdHMkbG9hZGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZhX2NoX2FkdWx0cyRsb2FkaW5ncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmFfdnRfYWR1bHRzJGxvYWRpbmdzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWdpdHMgPSA1KSAlPiUKICAjIGdldF91cHBlcl90cmlfZnVuKCkgJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigiZmFjdG9yX0EiKSAlPiUKICBnYXRoZXIoZmFjdG9yX0IsIGNvbmcsIC1mYWN0b3JfQSkgJT4lCiAgbGVmdF9qb2luKGZhY3Rvcl9uYW1lc19hZHVsdHMgJT4lIAogICAgICAgICAgICAgIHJlbmFtZV9hbGwobGlzdCh+IChwYXN0ZSguLCAiQSIsIHNlcCA9ICJfIikpKSkpICU+JQogIGxlZnRfam9pbihmYWN0b3JfbmFtZXNfYWR1bHRzICU+JSAKICAgICAgICAgICAgICByZW5hbWVfYWxsKGxpc3QofiAocGFzdGUoLiwgIkIiLCBzZXAgPSAiXyIpKSkpKQpgYGAKCmBgYHtyIHRvcCBtYXRjaCBhZHVsdHN9CmNvbmdfYWR1bHRzX3RvcF9tYXRjaF9BIDwtIHRvcF9tYXRjaF9mdW4oY29uZ19hZHVsdHMsICJjb3VudHJ5X0EiKQpjb25nX2FkdWx0c190b3BfbWF0Y2hfQiA8LSB0b3BfbWF0Y2hfZnVuKGNvbmdfYWR1bHRzLCAiY291bnRyeV9CIikKYGBgCgpgYGB7ciBjb25nIGFsbCBwYWlycyBhZHVsdHMsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjd9CmNvbmdfYWR1bHRzICU+JQogIG11dGF0ZV9hdCgjdmFycyhjb250YWlucygibGFiZGVzY3JpcHQiKSksCiAgICB2YXJzKGZhY3Rvcl9sYWJkZXNjcmlwdF9BKSwKICAgIGZ1bnMoZ3N1YigiIFxcKCIsICJcblxcKCIsIC4pKSkgJT4lCiAgbXV0YXRlX2F0KCN2YXJzKGNvbnRhaW5zKCJsYWJkZXNjcmlwdCIpKSwKICAgIHZhcnMoZmFjdG9yX2xhYmRlc2NyaXB0X0EpLAogICAgZnVucyhnc3ViKCJcXC8iLCAiXFwvXG4iLCAuKSkpICU+JQogICMgbGVmdF9qb2luKGNvbmdfYWR1bHRzX3RvcF9tYXRjaF9BICU+JSByZW5hbWUodG9wX21hdGNoX0EgPSB0b3BfbWF0Y2gpKSAlPiUKICBsZWZ0X2pvaW4oY29uZ19hZHVsdHNfdG9wX21hdGNoX0IgJT4lIHJlbmFtZSh0b3BfbWF0Y2hfQiA9IHRvcF9tYXRjaCkpICU+JQogIG11dGF0ZShpc190b3BfbWF0Y2ggPSBjYXNlX3doZW4oZmFjdG9yX0EgPT0gZmFjdG9yX0IgfiAiYm9sZC5pdGFsaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBmYWN0b3JfQSA9PSB0b3BfbWF0Y2hfQSB+ICJib2xkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9CID09IHRvcF9tYXRjaF9CIH4gImJvbGQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJwbGFpbiIpKSAlPiUKICAjIG11dGF0ZShjb25nID0gaWZlbHNlKGNvbmcgPT0gMSwgTkFfcmVhbF8sIGNvbmcpKSAlPiUKICBtdXRhdGUoc2FtcGxlX0EgPSBwYXN0ZSh0b3VwcGVyKGNvdW50cnlfQSksICJhZHVsdHMiLCBzZXAgPSAiOlxuIikpICU+JQogIG11dGF0ZShzYW1wbGVfQiA9IHBhc3RlKHRvdXBwZXIoY291bnRyeV9CKSwgImFkdWx0cyIsIHNlcCA9ICI6XG4iKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoY291bnRyeV9BLCBjb3VudHJ5X0IpLAogICAgICAgICAgICBmdW5zKGZhY3Rvcih0b3VwcGVyKC4pLCBsZXZlbHMgPSB0b3VwcGVyKGxldmVsc19jb3VudHJ5KSkpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBmYWN0b3JfbGFiZGVzY3JpcHRfQSwKICAgICAgICAgICAgIHkgPSByZW9yZGVyKGZhY3Rvcl9sYWJkZXNjcmlwdF9CLCBkZXNjKGZhY3Rvcl9sYWJkZXNjcmlwdF9CKSksCiAgICAgICAgICAgICBmaWxsID0gY29uZykpICsKICBmYWNldF9ncmlkKHJlb3JkZXIoc2FtcGxlX0IsIGFzLm51bWVyaWMoY291bnRyeV9CKSkgfiAKICAgICAgICAgICAgICAgcmVvcmRlcihzYW1wbGVfQSwgYXMubnVtZXJpYyhjb3VudHJ5X0EpKSwgCiAgICAgICAgICAgICBzY2FsZXMgPSAiZnJlZSIsIHNwYWNlID0gImZyZWUiKSArCiAgZ2VvbV90aWxlKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuMikgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSBjYXNlX3doZW4oaXMubmEoY29uZykgfiAiIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBmb3JtYXQocm91bmQoY29uZywgMiksIG5zbWFsbCA9IDIpKSwKICAgICAgICAgICAgICAgIGZvbnRmYWNlID0gaXNfdG9wX21hdGNoLAogICAgICAgICAgICAgICAgY29sb3IgPSBpc190b3BfbWF0Y2gpLAogICAgICAgICAgICBzaXplID0gMywgc2hvdy5sZWdlbmQgPSBGKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImRhcmtyZWQiLCAiZGFya2JsdWUiLCAiYmxhY2siKSkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKG9wdGlvbiA9ICJ2aXJpZGlzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcihiYXJ3aWR0aCA9IDI1LCBiYXJoZWlnaHQgPSAwLjUpKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTAsIGZhY2UgPSAiYm9sZCIpKSArCiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwsIGZpbGwgPSBleHByZXNzaW9uKGl0YWxpYyhyW2NdKSkpCmBgYAoKIyMgQm9vdHN0cmFwcGVkIGNvbmdydWVuY2UKCmBgYHtyIGJvb3RzdHJhcCBjb25ncnVlbmNlIGFkdWx0c30KaWYgKGZpbGUuZXhpc3RzKCIuLi9yZXN1bHRzL2NvbmdfZGZfYWR1bHRzX29ibGlxdWVfZGVtb2JhbC5SRFMiKSkgewogIAogIGNvbmdfZGZfYWR1bHRzIDwtIHJlYWRSRFMoIi4uL3Jlc3VsdHMvY29uZ19kZl9hZHVsdHNfb2JsaXF1ZV9kZW1vYmFsLlJEUyIpCiAgCn0gZWxzZSB7CiAgCiAgYnNfYWR1bHRzIDwtIGxvYWRpbmdzX2FkdWx0cyAlPiUKICAgIHNlbGVjdChjYXBhY2l0eSwgZmFjdG9yLCBsb2FkaW5nKSAlPiUKICAgIHNwcmVhZChmYWN0b3IsIGxvYWRpbmcpICU+JQogICAgc2VsZWN0KC1jYXBhY2l0eSkgJT4lCiAgICBzanN0YXRzOjpib290c3RyYXAoMTAwMCkgCiAgCiAgZmFjdG9ycyA8LSBsZXZlbHMoZmFjdG9yKGxvYWRpbmdzX2FkdWx0cyRmYWN0b3IpKQogIAogIGNvbmdfZGZfYWR1bHRzIDwtIGRhdGEuZnJhbWUoTlVMTCkKICBmb3IgKGkgaW4gZmFjdG9ycykgewogICAgZm9yIChqIGluIGZhY3RvcnMpIHsKICAgICAgY25hbWUgPC0gcGFzdGUoaSwgaiwgc2VwID0gIi4iKQogICAgICB0ZW1wIDwtIGJzX2FkdWx0cyAlPiUKICAgICAgICBtdXRhdGUoY29uZyA9IG1hcF9kYmwoc3RyYXAsIH5sc2E6OmNvc2luZShhcy5kYXRhLmZyYW1lKC54KVssaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMuZGF0YS5mcmFtZSgueClbLGpdKSkpCiAgICAgIGNvbmdfZGZfYWR1bHRzWzE6MTAwMCwgY25hbWVdIDwtIHRlbXAkY29uZwogICAgfQogIH0KICAKICBjb25nX2RmX2FkdWx0cyA8LSBjb25nX2RmX2FkdWx0cyAlPiUKICAgIGdhdGhlcihmYWN0b3JfcGFpciwgY29uZykgJT4lCiAgICBzZXBhcmF0ZShmYWN0b3JfcGFpciwgaW50byA9IGMoImZhY3Rvcl9BIiwgImZhY3Rvcl9CIiksIHNlcCA9ICJcXC4iKSAlPiUKICAgIGdyb3VwX2J5KGZhY3Rvcl9BLCBmYWN0b3JfQikgJT4lCiAgICBzdW1tYXJpc2UobWVhbiA9IG1lYW4oY29uZyksCiAgICAgICAgICAgICAgY2lfbG93ZXIgPSBjaV9sb3dlcihjb25nKSwKICAgICAgICAgICAgICBjaV91cHBlciA9IGNpX3VwcGVyKGNvbmcpKSAlPiUKICAgIHVuZ3JvdXAoKSAlPiUKICAgIGxlZnRfam9pbihmYWN0b3JfbmFtZXNfYWR1bHRzICU+JQogICAgICAgICAgICAgICAgcmVuYW1lX2FsbChmdW5zKHBhc3RlKC4sICJBIiwgc2VwID0gIl8iKSkpKSAlPiUKICAgIGxlZnRfam9pbihmYWN0b3JfbmFtZXNfYWR1bHRzICU+JQogICAgICAgICAgICAgICAgcmVuYW1lX2FsbChmdW5zKHBhc3RlKC4sICJCIiwgc2VwID0gIl8iKSkpKQogIAogIHJtKGksIGosIGNuYW1lLCB0ZW1wLCBmYWN0b3JzKQogIAogIHNhdmVSRFMoY29uZ19kZl9hZHVsdHMsIGZpbGUgPSAiLi4vcmVzdWx0cy9jb25nX2RmX2FkdWx0c19vYmxpcXVlX2RlbW9iYWwuUkRTIikKfQpgYGAKCmBgYHtyIGNvbmcgbWluIGFkdWx0c30KIyBmaW5kIG1pbmltdW0gdmFsdWUgdG8gc2V0IGNvbnN0YW50IGxvd2VyIGJvdW5kIG9mIHBsb3RzCm1pbl9jb25nX2FkdWx0cyA8LSBjb25nX2RmX2FkdWx0cyAlPiUKICBzdW1tYXJpc2UobWluX2NvbmcgPSBtaW4oY2lfbG93ZXIsIG5hLnJtID0gVCkpCmBgYAoKYGBge3IgY29uZyBjaXMgdXMgYmFzZSBhZHVsdHMsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAwLjl9CiMgRklHVVJFIDMKY29uZ19wbG90X2Z1bihjb25nX2RmID0gY29uZ19kZl9hZHVsdHMsIHdoaWNoX2NvdW50cnkgPSAiVVMiKSArCiAgeWxpbShtaW5fY29uZ19hZHVsdHMkbWluX2NvbmcsIDEpICsKICAjIHlsaW0oTkEsIDEpICsKICBsYWJzKHggPSBOVUxMKQpnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnMDNfb2JsaXF1ZV9kZW1vYmFsLnBuZyIpCmBgYAoKYGBge3IgY29uZyBjaXMgZ2ggYmFzZSBhZHVsdHMsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAwLjl9CiMgRklHVVJFIFMxCmNvbmdfcGxvdF9mdW4oY29uZ19kZiA9IGNvbmdfZGZfYWR1bHRzICU+JQogICAgICAgICAgICAgICAgbXV0YXRlX2F0KCN2YXJzKGNvbnRhaW5zKCJsYWJkZXNjcmlwdCIpKSwKICAgICAgICAgICAgICAgICAgdmFycyhmYWN0b3JfbGFiZGVzY3JpcHRfQSksCiAgICAgICAgICAgICAgICAgIGZ1bnMoZ3N1YigiIFxcKCIsICJcblxcKCIsIC4pKSkgJT4lCiAgICAgICAgICAgICAgICBtdXRhdGVfYXQoI3ZhcnMoY29udGFpbnMoImxhYmRlc2NyaXB0IikpLAogICAgICAgICAgICAgICAgICB2YXJzKGZhY3Rvcl9sYWJkZXNjcmlwdF9BKSwKICAgICAgICAgICAgICAgICAgZnVucyhnc3ViKCJcXC8iLCAiXFwvXG4iLCAuKSkpLCAKICAgICAgICAgICAgICB3aGljaF9jb3VudHJ5ID0gIkdoYW5hIikgKwogIHlsaW0obWluX2NvbmdfYWR1bHRzJG1pbl9jb25nLCAxKQpnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnUzAxX29ibGlxdWVfZGVtb2JhbC5wbmciKQpgYGAKCmBgYHtyIGNvbmcgY2lzIHRoIGJhc2UgYWR1bHRzLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMC45fQojIEZJR1VSRSBTMgpjb25nX3Bsb3RfZnVuKGNvbmdfZGYgPSBjb25nX2RmX2FkdWx0cywgCiAgICAgICAgICAgICAgd2hpY2hfY291bnRyeSA9ICJUaGFpbGFuZCIpICsKICB5bGltKG1pbl9jb25nX2FkdWx0cyRtaW5fY29uZywgMSkKZ2dzYXZlKCIuLi9maWd1cmVzL2ZpZ1MwMl9vYmxpcXVlX2RlbW9iYWwucG5nIikKYGBgCgpgYGB7ciBjb25nIGNpcyBjaCBiYXNlIGFkdWx0cywgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDAuOX0KIyBGSUdVUkUgUzMKY29uZ19wbG90X2Z1bihjb25nX2RmID0gY29uZ19kZl9hZHVsdHMsIAogICAgICAgICAgICAgIHdoaWNoX2NvdW50cnkgPSAiQ2hpbmEiKSArCiAgeWxpbShtaW5fY29uZ19hZHVsdHMkbWluX2NvbmcsIDEpCmdnc2F2ZSgiLi4vZmlndXJlcy9maWdTMDNfb2JsaXF1ZV9kZW1vYmFsLnBuZyIpCmBgYAoKYGBge3IgY29uZyBjaXMgdnQgYmFzZSBhZHVsdHMsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAwLjl9CiMgRklHVVJFIFM0CmNvbmdfcGxvdF9mdW4oY29uZ19kZiA9IGNvbmdfZGZfYWR1bHRzICU+JQogICAgICAgICAgICAgICAgbXV0YXRlX2F0KCN2YXJzKGNvbnRhaW5zKCJsYWJkZXNjcmlwdCIpKSwKICAgICAgICAgICAgICAgICAgdmFycyhmYWN0b3JfbGFiZGVzY3JpcHRfQSksCiAgICAgICAgICAgICAgICAgIGZ1bnMoZ3N1YigiIFxcKCIsICJcblxcKCIsIC4pKSkgJT4lCiAgICAgICAgICAgICAgICBtdXRhdGVfYXQoI3ZhcnMoY29udGFpbnMoImxhYmRlc2NyaXB0IikpLAogICAgICAgICAgICAgICAgICB2YXJzKGZhY3Rvcl9sYWJkZXNjcmlwdF9BKSwKICAgICAgICAgICAgICAgICAgZnVucyhnc3ViKCJcXC8iLCAiXFwvXG4iLCAuKSkpLCAKICAgICAgICAgICAgICB3aGljaF9jb3VudHJ5ID0gIlZhbnVhdHUiKSArCiAgeWxpbShtaW5fY29uZ19hZHVsdHMkbWluX2NvbmcsIDEpCmdnc2F2ZSgiLi4vZmlndXJlcy9maWdTMDRfb2JsaXF1ZV9kZW1vYmFsLnBuZyIpCmBgYAoKYGBge3IgYm9keSBtaW5kIGNvbmcgYWR1bHRzfQojICJJbiBlYWNoIHNhbXBsZSwgdGhlcmUgd2FzIGEgZmFjdG9yIHRoYXQgd2FzIHNpbWlsYXIgdG8gVVMgYWR1bHRz4oCZIOKAnGJvZHnigJ0gZmFjdG9yLi4uCmNvbmdfZGZfYWR1bHRzICU+JSAKICBmaWx0ZXIoZ3JlcGwoImJvZHkiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9BKSksIAogICAgICAgICBncmVwbCgiYm9keSIsIHRvbG93ZXIoZmFjdG9yX2Rlc2NyaXB0X0IpKSwKICAgICAgICAgY291bnRyeV9BICE9ICJVUyIsIGNvdW50cnlfQiA9PSAiVVMiKQoKIyAiLi4uYW5kIG5vdCBzaW1pbGFyIHRvIHRoZSBVUyBhZHVsdCDigJxtaW5k4oCdIGZhY3RvciwgLi4uCmNvbmdfZGZfYWR1bHRzICU+JSAKICBmaWx0ZXIoZ3JlcGwoImJvZHkiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9BKSksIAogICAgICAgICBncmVwbCgibWluZCIsIHRvbG93ZXIoZmFjdG9yX2Rlc2NyaXB0X0IpKSwKICAgICAgICAgY291bnRyeV9BICE9ICJVUyIsIGNvdW50cnlfQiA9PSAiVVMiKQoKIyAiLi4uIGFuZCBhIGZhY3RvciB0aGF0IHdhcyBtdWNoIG1vcmUgc2ltaWxhciB0byBVUyBhZHVsdHPigJkg4oCcbWluZOKAnSBmYWN0b3IuLi4KY29uZ19kZl9hZHVsdHMgJT4lIAogIGZpbHRlcihncmVwbCgibWluZCIsIHRvbG93ZXIoZmFjdG9yX2Rlc2NyaXB0X0EpKSwgCiAgICAgICAgIGdyZXBsKCJtaW5kIiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQikpLAogICAgICAgICBjb3VudHJ5X0EgIT0gIlVTIiwgY291bnRyeV9CID09ICJVUyIpCgojICIuLi50aGFuIHRoZSBVUyBhZHVsdCDigJxib2R54oCdIGZhY3Rvci4iCmNvbmdfZGZfYWR1bHRzICU+JSAKICBmaWx0ZXIoZ3JlcGwoIm1pbmQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9BKSksIAogICAgICAgICBncmVwbCgiYm9keSIsIHRvbG93ZXIoZmFjdG9yX2Rlc2NyaXB0X0IpKSwKICAgICAgICAgY291bnRyeV9BICE9ICJVUyIsIGNvdW50cnlfQiA9PSAiVVMiKQpgYGAKYGBge3IgaGVhcnQgY29uZyBhZHVsdHN9CmNvbmdfZGZfYWR1bHRzICU+JSAKICBmaWx0ZXIoZ3JlcGwoImhlYXJ0IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQSkpLCAKICAgICAgICAgZ3JlcGwoImhlYXJ0IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQikpLAogICAgICAgICBjb3VudHJ5X0EgJWluJSBjKCJUaGFpbGFuZCIsICJDaGluYSIpLCBjb3VudHJ5X0IgPT0gIlVTIikKCmNvbmdfZGZfYWR1bHRzICU+JSAKICBmaWx0ZXIoZ3JlcGwoImJvZHkiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9BKSkgfCAKICAgICAgICAgICBncmVwbCgibWluZCIsIHRvbG93ZXIoZmFjdG9yX2Rlc2NyaXB0X0EpKSwKICAgICAgICAgZ3JlcGwoImhlYXJ0IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQikpLAogICAgICAgICBjb3VudHJ5X0EgJWluJSBjKCJUaGFpbGFuZCIsICJDaGluYSIpLCBjb3VudHJ5X0IgPT0gIlVTIikKYGBgCgoKIyBDaGlsZHJlbgoKIyMgU2FtcGxlcwoKYGBge3Igc2FtcGxlcyBjaGlsZHJlbn0KYmluZF9yb3dzKGRfdXNfY2hpbGRyZW4sIGRfZ2hfY2hpbGRyZW4sIGRfdGhfY2hpbGRyZW4sIGRfY2hfY2hpbGRyZW4sIGRfdnRfY2hpbGRyZW4pICU+JQogIG11dGF0ZShjb3VudHJ5ID0gZmFjdG9yKGNvdW50cnksIGxldmVscyA9IGxldmVsc19jb3VudHJ5KSkgJT4lCiAgZGlzdGluY3QoY291bnRyeSwgc3Vial9pZCkgJT4lCiAgY291bnQoY291bnRyeSkgJT4lIAogIGphbml0b3I6OmFkb3JuX3RvdGFscygpCmBgYAoKIyMgU2NhbGUgdXNlCgpgYGB7ciBzY2FsZSB1c2UgbWVhbiBvdmVyYWxsIGNoaWxkcmVufQpiaW5kX3Jvd3MoZF91c19jaGlsZHJlbiwgZF9naF9jaGlsZHJlbiwgZF90aF9jaGlsZHJlbiwgZF9jaF9jaGlsZHJlbiwgZF92dF9jaGlsZHJlbikgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBmYWN0b3IoY291bnRyeSwgbGV2ZWxzID0gbGV2ZWxzX2NvdW50cnkpLAogICAgICAgICByZXNwb25zZV9jYXQgPSByZWNvZGVfZmFjdG9yKHJlc3BvbnNlX2NhdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm8iID0gIm5vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAia2luZCBvZiIgPSAia2luZCBvZiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInllcyIgPSAieWVzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1pc3NpbmcgPSAibWlzc2luZyBkYXRhIikpICU+JQogIGNvdW50KGNvdW50cnksIHJlc3BvbnNlX2NhdCkgJT4lCiAgY29tcGxldGUocmVzcG9uc2VfY2F0LCBuZXN0aW5nKGNvdW50cnkpLCBmaWxsID0gbGlzdChuID0gMCkpICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIG11dGF0ZShwcm9wID0gbi9zdW0obiwgbmEucm0gPSBUKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIHNlbGVjdCgtbikgJT4lCiAgc3ByZWFkKHJlc3BvbnNlX2NhdCwgcHJvcCkgJT4lCiAgamFuaXRvcjo6YWRvcm5fcGN0X2Zvcm1hdHRpbmcoZGlnaXRzID0gMikKYGBgCgojIyBGYWN0b3IgcmV0ZW50aW9uOiBwYXJhbGxlbCBhbmFseXNpcwoKYGBge3IgcGFyYWxsZWwgZGlzdCBjaGlsZHJlbiwgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDAuNX0KIyBOT1RFOiB0aGVyZSBhcHBlYXJzIHRvIGJlIHNvbWUgdW5yZWxpYWJpbGl0eS9ub24tcmVwcm9kdWNpYmlsaXR5IGluIHJlc3VsdHMsIGVzcGVjaWFsbHkgZm9yIHZ0IGFkdWx0cywgd2hpY2ggSSBkb24ndCB1bmRlcnN0YW5kIC0tIHNvIGhlcmUncyB0aGUgZGlzdHJpYnV0aW9uIG92ZXIgb3V0Y29tZXMgb2YgcGFyYWxsZWwgYW5hbHlzaXMgd2l0aCAxMDAgaXRlcmF0aW9ucy4gV2UnbGwgY2hvb3NlIHRoZSBtZWRpYW4gbnVtYmVyIG9mIGZhY3RvcnMuCgppZiAoZmlsZS5leGlzdHMoIi4uL3Jlc3VsdHMvcGFfb3V0Y29tZXNfZGlzdF9jaGlsZHJlbl9kZW1vYmFsLlJEUyIpKSB7CiAgCiAgcGFfb3V0Y29tZXNfZGlzdF9jaGlsZHJlbiA8LSByZWFkUkRTKCIuLi9yZXN1bHRzL3BhX291dGNvbWVzX2Rpc3RfY2hpbGRyZW5fZGVtb2JhbC5SRFMiKQogIAp9IGVsc2UgewogIAogIHBhX291dGNvbWVzX2Rpc3RfY2hpbGRyZW4gPC0gZGF0YS5mcmFtZSh1cyA9IE5VTEwsIGdoID0gTlVMTCwgdGggPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaCA9IE5VTEwsIHZ0ID0gTlVMTCkKICAKICBzZXQuc2VlZCg1NDMyMSkKICBuX2NvcmVzIDwtIHBhcmFsbGVsOjpkZXRlY3RDb3JlcygpCiAgb3B0aW9ucyhtYy5jb3JlcyA9IG5fY29yZXMpCiAgCiAgZm9yIChpIGluIDE6MTAwKSB7CiAgICBwYV9vdXRjb21lc19kaXN0X2NoaWxkcmVuW2ksICJ1cyJdIDwtIGZhLnBhcmFsbGVsKGRfdXNfY2hpbGRyZW5fdywgcGxvdCA9IEYpJG5mYWN0CiAgICBwYV9vdXRjb21lc19kaXN0X2NoaWxkcmVuW2ksICJnaCJdIDwtIGZhLnBhcmFsbGVsKGRfZ2hfY2hpbGRyZW5fdywgcGxvdCA9IEYpJG5mYWN0ICAgICAKICAgIHBhX291dGNvbWVzX2Rpc3RfY2hpbGRyZW5baSwgInRoIl0gPC0gZmEucGFyYWxsZWwoZF90aF9jaGlsZHJlbl93LCBwbG90ID0gRikkbmZhY3QKICAgIHBhX291dGNvbWVzX2Rpc3RfY2hpbGRyZW5baSwgImNoIl0gPC0gZmEucGFyYWxsZWwoZF9jaF9jaGlsZHJlbl93LCBwbG90ID0gRikkbmZhY3QKICAgIHBhX291dGNvbWVzX2Rpc3RfY2hpbGRyZW5baSwgInZ0Il0gPC0gZmEucGFyYWxsZWwoZF92dF9jaGlsZHJlbl93LCBwbG90ID0gRikkbmZhY3QKICB9CiAgCiAgc2F2ZVJEUyhwYV9vdXRjb21lc19kaXN0X2NoaWxkcmVuLCBmaWxlID0gIi4uL3Jlc3VsdHMvcGFfb3V0Y29tZXNfZGlzdF9jaGlsZHJlbl9kZW1vYmFsLlJEUyIpCn0KCiMgcGxvdApwYV9vdXRjb21lc19kaXN0X2NoaWxkcmVuICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigiaXRlciIpICU+JQogIGdhdGhlcihjb3VudHJ5LCBuZmFjdCwgLWl0ZXIpICU+JQogIG11dGF0ZShjb3VudHJ5ID0gZmFjdG9yKGNvdW50cnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygidXMiLCAiZ2giLCAidGgiLCAiY2giLCAidnQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBsZXZlbHNfY291bnRyeSkpICU+JQogIGdncGxvdChhZXMoeCA9IG5mYWN0KSkgKwogIGZhY2V0X2dyaWQofiBjb3VudHJ5KSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJjb3VudCIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygxLCBtYXgocGFfb3V0Y29tZXNfZGlzdF9jaGlsZHJlbikgKyAxKSwKICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKDAsIDEwMCwgMSkpICsKICBsYWJzKHggPSAiTnVtYmVyIG9mIGZhY3RvcnMgc3VnZ2VzdGVkIGJ5IGZhLnBhcmFsbGVsKCkiKQpgYGAKCiMjIEV4cGxvcmF0b3J5IGZhY3RvciBhbmFseXNpcwoKYGBge3IgZWZhIGNoaWxkcmVufQpzZXQuc2VlZCg1NDMyMSkKCiMgZG8gZXhwbG9yYXRvcnkgZmFjdG9yIGFuYWx5c2lzOiBjaGlsZHJlbgplZmFfdXNfY2hpbGRyZW4gPC0gZmFfZnVuKGRfdXNfY2hpbGRyZW5fdywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IG1lZGlhbihwYV9vdXRjb21lc19kaXN0X2NoaWxkcmVuJHVzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9zZW5fbi5pdGVyID0gMTAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9zZW5fcm90ID0gIm9ibGltaW4iKQpjb2xuYW1lcyhlZmFfdXNfY2hpbGRyZW4kbG9hZGluZ3MpIDwtIHBhc3RlMCgidXNDSElMRFJFTl8iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZXMoZWZhX3VzX2NoaWxkcmVuJGxvYWRpbmdzKSkKCmVmYV9naF9jaGlsZHJlbiA8LSBmYV9mdW4oZF9naF9jaGlsZHJlbl93LAogICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBtZWRpYW4ocGFfb3V0Y29tZXNfZGlzdF9jaGlsZHJlbiRnaCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvc2VuX24uaXRlciA9IDEwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvc2VuX3JvdCA9ICJvYmxpbWluIikKY29sbmFtZXMoZWZhX2doX2NoaWxkcmVuJGxvYWRpbmdzKSA8LSBwYXN0ZTAoImdoQ0hJTERSRU5fIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWVzKGVmYV9naF9jaGlsZHJlbiRsb2FkaW5ncykpCgplZmFfdGhfY2hpbGRyZW4gPC0gZmFfZnVuKGRfdGhfY2hpbGRyZW5fdywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IG1lZGlhbihwYV9vdXRjb21lc19kaXN0X2NoaWxkcmVuJHRoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9zZW5fbi5pdGVyID0gMTAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9zZW5fcm90ID0gIm9ibGltaW4iKQpjb2xuYW1lcyhlZmFfdGhfY2hpbGRyZW4kbG9hZGluZ3MpIDwtIHBhc3RlMCgidGhDSElMRFJFTl8iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZXMoZWZhX3RoX2NoaWxkcmVuJGxvYWRpbmdzKSkKCmVmYV9jaF9jaGlsZHJlbiA8LSBmYV9mdW4oZF9jaF9jaGlsZHJlbl93LCAKICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gbWVkaWFuKHBhX291dGNvbWVzX2Rpc3RfY2hpbGRyZW4kY2gpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNob3Nlbl9uLml0ZXIgPSAxMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNob3Nlbl9yb3QgPSAib2JsaW1pbiIpCmNvbG5hbWVzKGVmYV9jaF9jaGlsZHJlbiRsb2FkaW5ncykgPC0gcGFzdGUwKCJjaENISUxEUkVOXyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lcyhlZmFfY2hfY2hpbGRyZW4kbG9hZGluZ3MpKQoKZWZhX3Z0X2NoaWxkcmVuIDwtIGZhX2Z1bihkX3Z0X2NoaWxkcmVuX3csIAogICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBtZWRpYW4ocGFfb3V0Y29tZXNfZGlzdF9jaGlsZHJlbiR2dCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvc2VuX24uaXRlciA9IDEwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvc2VuX3JvdCA9ICJvYmxpbWluIikKY29sbmFtZXMoZWZhX3Z0X2NoaWxkcmVuJGxvYWRpbmdzKSA8LSBwYXN0ZTAoInZ0Q0hJTERSRU5fIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWVzKGVmYV92dF9jaGlsZHJlbiRsb2FkaW5ncykpCmBgYAoKYGBge3IgZmFjdG9yIG5hbWVzIGNoaWxkcmVufQpmYWN0b3JfbmFtZXNfY2hpbGRyZW4gPC0gZGF0YS5mcmFtZShmYWN0b3IgPSBjKGNvbG5hbWVzKGVmYV91c19jaGlsZHJlbiRsb2FkaW5ncyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZXMoZWZhX2doX2NoaWxkcmVuJGxvYWRpbmdzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lcyhlZmFfdGhfY2hpbGRyZW4kbG9hZGluZ3MpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWVzKGVmYV9jaF9jaGlsZHJlbiRsb2FkaW5ncyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZXMoZWZhX3Z0X2NoaWxkcmVuJGxvYWRpbmdzKSkpICU+JQogIG11dGF0ZShhZ2VfZ3JvdXAgPSAiY2hpbGRyZW4iKSAlPiUKICBtdXRhdGUoY291bnRyeSA9IGNhc2Vfd2hlbihncmVwbCgiXnVzIiwgZmFjdG9yKSB+ICJVUyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoIl5naCIsIGZhY3RvcikgfiAiR2hhbmEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCJedGgiLCBmYWN0b3IpIH4gIlRoYWlsYW5kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbCgiXmNoIiwgZmFjdG9yKSB+ICJDaGluYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoIl52dCIsIGZhY3RvcikgfiAiVmFudWF0dSIpLAogICAgICAgICBjb3VudHJ5ID0gZmFjdG9yKGNvdW50cnksIGxldmVsc19jb3VudHJ5KSkgJT4lCiAgbXV0YXRlKGZhY3Rvcl9uYW1lID0gZ3N1YigiXnVzIiwgIlVTICIsIGZhY3RvciksCiAgICAgICAgIGZhY3Rvcl9uYW1lID0gZ3N1YigiXmdoIiwgIkdoLiAiLCBmYWN0b3JfbmFtZSksCiAgICAgICAgIGZhY3Rvcl9uYW1lID0gZ3N1YigiXnRoIiwgIlRoLiAiLCBmYWN0b3JfbmFtZSksCiAgICAgICAgIGZhY3Rvcl9uYW1lID0gZ3N1YigiXmNoIiwgIkNoLiAiLCBmYWN0b3JfbmFtZSksCiAgICAgICAgIGZhY3Rvcl9uYW1lID0gZ3N1YigiXnZ0IiwgIlZhLiAiLCBmYWN0b3JfbmFtZSksCiAgICAgICAgIGZhY3Rvcl9uYW1lID0gZ3N1YigiQ0hJTERSRU4iLCAiY2hpbGRyZW4iLCBmYWN0b3JfbmFtZSksCiAgICAgICAgIGZhY3Rvcl9uYW1lID0gZ3N1YigiX0YiLCAiIEZhY3RvciAiLCBmYWN0b3JfbmFtZSkpICU+JQogIG11dGF0ZShmYWN0b3JfZGVzY3JpcHQgPSByZWNvZGUoZmFjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNDSElMRFJFTl9GMSA9ICJCb2R5LWxpa2UsIG5lZ2F0aXZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzQ0hJTERSRU5fRjMgPSAiSGVhcnQtbGlrZSwgcG9zaXRpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNDSElMRFJFTl9GMiA9ICJNaW5kLWxpa2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2hDSElMRFJFTl9GMSA9ICJCb2R5LWxpa2UsIG5lZ2F0aXZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdoQ0hJTERSRU5fRjIgPSAiTWluZC1saWtlLCBwb3NpdGl2ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aENISUxEUkVOX0YxID0gIkJvZHktbGlrZSwgcG9zaXRpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhDSElMRFJFTl9GMiA9ICJNaW5kLWxpa2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhDSElMRFJFTl9GMyA9ICJIZWFydC1saWtlLCBuZWdhdGl2ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaENISUxEUkVOX0YxID0gIk1pbmQtbGlrZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaENISUxEUkVOX0YyID0gIkhlYXJ0LWxpa2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hDSElMRFJFTl9GMyA9ICJCb2R5LWxpa2UgMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaENISUxEUkVOX0Y0ID0gIkJvZHktbGlrZSAyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ0Q0hJTERSRU5fRjEgPSAiQm9keS1saWtlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ0Q0hJTERSRU5fRjIgPSAiSGVhcnQtbGlrZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2dENISUxEUkVOX0YzID0gIk1pbmQtbGlrZSIpLAogICAgICAgICBmYWN0b3JfbGFiZGVzY3JpcHQgPSBwYXN0ZShnc3ViKCIuKl9GIiwgIkYiLCBmYWN0b3IpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfZGVzY3JpcHQsIHNlcCA9ICI6ICIpKQpgYGAKCiMjIEZhY3RvciBsb2FkaW5ncwoKYGBge3Igb3JkZXIgY2hpbGRyZW59CiMgb3JkZXIgY2FwYWNpdGllczogY2hpbGRyZW4Kb3JkZXJfdXNfY2hpbGRyZW4gPC0gZmEuc29ydChlZmFfdXNfY2hpbGRyZW4pJGxvYWRpbmdzW10gJT4lIHJvd25hbWVzKCkKb3JkZXJfZ2hfY2hpbGRyZW4gPC0gZmEuc29ydChlZmFfZ2hfY2hpbGRyZW4pJGxvYWRpbmdzW10gJT4lIHJvd25hbWVzKCkKb3JkZXJfdGhfY2hpbGRyZW4gPC0gZmEuc29ydChlZmFfdGhfY2hpbGRyZW4pJGxvYWRpbmdzW10gJT4lIHJvd25hbWVzKCkKb3JkZXJfY2hfY2hpbGRyZW4gPC0gZmEuc29ydChlZmFfY2hfY2hpbGRyZW4pJGxvYWRpbmdzW10gJT4lIHJvd25hbWVzKCkKb3JkZXJfdnRfY2hpbGRyZW4gPC0gZmEuc29ydChlZmFfdnRfY2hpbGRyZW4pJGxvYWRpbmdzW10gJT4lIHJvd25hbWVzKCkKYGBgCgpgYGB7ciBsb2FkaW5ncyBjaGlsZHJlbn0KIyBjb21waWxlIGxvYWRpbmdzOiBjaGlsZHJlbgpsb2FkaW5nc19jaGlsZHJlbiA8LSBiaW5kX3Jvd3MoCiAgbG9hZGluZ3NfZnVuKGVmYV91c19jaGlsZHJlbikgJT4lIG11dGF0ZShjb3VudHJ5ID0gIlVTIiksCiAgbG9hZGluZ3NfZnVuKGVmYV9naF9jaGlsZHJlbikgJT4lIG11dGF0ZShjb3VudHJ5ID0gIkdoYW5hIiksCiAgbG9hZGluZ3NfZnVuKGVmYV90aF9jaGlsZHJlbikgJT4lIG11dGF0ZShjb3VudHJ5ID0gIlRoYWlsYW5kIiksCiAgbG9hZGluZ3NfZnVuKGVmYV9jaF9jaGlsZHJlbikgJT4lIG11dGF0ZShjb3VudHJ5ID0gIkNoaW5hIiksCiAgbG9hZGluZ3NfZnVuKGVmYV92dF9jaGlsZHJlbikgJT4lIG11dGF0ZShjb3VudHJ5ID0gIlZhbnVhdHUiKSkgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBmYWN0b3IoY291bnRyeSwgbGV2ZWxzID0gbGV2ZWxzX2NvdW50cnkpLAogICAgICAgICBjYXBhY2l0eV9vcmRfdXMgPSBmYWN0b3IoY2FwYWNpdHksIGxldmVscyA9IG9yZGVyX3VzX2NoaWxkcmVuKSwKICAgICAgICAgY2FwYWNpdHlfb3JkX2doID0gZmFjdG9yKGNhcGFjaXR5LCBsZXZlbHMgPSBvcmRlcl9naF9jaGlsZHJlbiksCiAgICAgICAgIGNhcGFjaXR5X29yZF90aCA9IGZhY3RvcihjYXBhY2l0eSwgbGV2ZWxzID0gb3JkZXJfdGhfY2hpbGRyZW4pLAogICAgICAgICBjYXBhY2l0eV9vcmRfY2ggPSBmYWN0b3IoY2FwYWNpdHksIGxldmVscyA9IG9yZGVyX2NoX2NoaWxkcmVuKSwKICAgICAgICAgY2FwYWNpdHlfb3JkX3Z0ID0gZmFjdG9yKGNhcGFjaXR5LCBsZXZlbHMgPSBvcmRlcl92dF9jaGlsZHJlbikpICU+JQogIGFycmFuZ2UoY291bnRyeSwgZmFjdG9yLCBkZXNjKGFicyhsb2FkaW5nKSksIGNhcGFjaXR5KSAlPiUKICBtdXRhdGUob3JkZXIgPSAxOm5yb3coLikpICU+JQogIGxlZnRfam9pbihmYWN0b3JfbmFtZXNfY2hpbGRyZW4pCmBgYAoKYGBge3IgaGVhdG1hcHMgYnkgc2l0ZSBjaGlsZHJlbiwgZmlnLndpZHRoID0gMTUsIGZpZy5hc3AgPSAwLjI1fQpwbG90X2dyaWQoaGVhdG1hcF9mdW4oZWZhX3VzX2NoaWxkcmVuLCAKICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGZhY3Rvcl9uYW1lc19jaGlsZHJlbiAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGNvdW50cnkgPT0gIlVTIikgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChmYWN0b3JfbGFiZGVzY3JpcHQpICU+JQogICAgICAgICAgICAgICAgICAgICAgICB1bmxpc3QoKSkgKyAKICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgICAgICAgICAgIGxhYnModGl0bGUgPSAiVVM6IGNoaWxkcmVuIiksCiAgICAgICAgICBoZWF0bWFwX2Z1bihlZmFfZ2hfY2hpbGRyZW4sCiAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBmYWN0b3JfbmFtZXNfY2hpbGRyZW4gJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihjb3VudHJ5ID09ICJHaGFuYSIpICU+JQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoZmFjdG9yX2xhYmRlc2NyaXB0KSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KCkpICsgCiAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogICAgICAgICAgICBsYWJzKHRpdGxlID0gIkdIQU5BOiBjaGlsZHJlbiIpLAogICAgICAgICAgaGVhdG1hcF9mdW4oZWZhX3RoX2NoaWxkcmVuLAogICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX25hbWVzID0gZmFjdG9yX25hbWVzX2NoaWxkcmVuICU+JQogICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoY291bnRyeSA9PSAiVGhhaWxhbmQiKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KGZhY3Rvcl9sYWJkZXNjcmlwdCkgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIHVubGlzdCgpKSArIAogICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICAgICAgICAgICAgbGFicyh0aXRsZSA9ICJUSEFJTEFORDogY2hpbGRyZW4iKSwKICAgICAgICAgIGhlYXRtYXBfZnVuKGVmYV9jaF9jaGlsZHJlbiwKICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGZhY3Rvcl9uYW1lc19jaGlsZHJlbiAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGNvdW50cnkgPT0gIkNoaW5hIikgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChmYWN0b3JfbGFiZGVzY3JpcHQpICU+JQogICAgICAgICAgICAgICAgICAgICAgICB1bmxpc3QoKSkgKyAKICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgICAgICAgICAgIGxhYnModGl0bGUgPSAiQ0hJTkE6IGNoaWxkcmVuIiksCiAgICAgICAgICBoZWF0bWFwX2Z1bihlZmFfdnRfY2hpbGRyZW4sCiAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBmYWN0b3JfbmFtZXNfY2hpbGRyZW4gJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihjb3VudHJ5ID09ICJWYW51YXR1IikgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChmYWN0b3JfbGFiZGVzY3JpcHQpICU+JQogICAgICAgICAgICAgICAgICAgICAgICB1bmxpc3QoKSkgKyAKICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgICAgICAgICAgIGxhYnModGl0bGUgPSAiVkFOVUFUVTogY2hpbGRyZW4iKSwKICAgICAgICAgIG5jb2wgPSA1KQpgYGAKCmBgYHtyIGhlYXRtYXAgY2hpbGRyZW4sIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjd9CiMgbWFrZSBoZWF0bWFwIGZpZ3VyZTogY2hpbGRyZW4KbG9hZGluZ3NfY2hpbGRyZW4gJT4lCiAgbXV0YXRlKGZhY3Rvcl9udW0gPSBhcy5udW1lcmljKGdzdWIoIi4qRiIsICIiLCBmYWN0b3IpKSkgJT4lCiAgbXV0YXRlKHNhbXBsZSA9IHBhc3RlKGNvdW50cnksICJjaGlsZHJlbiIsIHNlcCA9ICJcbiIpKSAlPiUKICBsZWZ0X2pvaW4oZmFjdG9yX25hbWVzX2NoaWxkcmVuKSAlPiUKICBtdXRhdGUoY291bnRyeSA9IGZhY3Rvcihjb3VudHJ5LCBsZXZlbHMgPSBsZXZlbHNfY291bnRyeSkpICU+JQogIGdncGxvdChhZXMoeCA9IHJlb3JkZXIoZmFjdG9yX2xhYmRlc2NyaXB0LCBmYWN0b3JfbnVtKSwgCiAgICAgICAgICAgICB5ID0gcmVvcmRlcihjYXBhY2l0eSwgZGVzYyhjYXBhY2l0eV9vcmRfdXMpKSwKICAgICAgICAgICAgICMgeSA9IHJlb3JkZXIoY2FwYWNpdHksIGRlc2MoY2FwYWNpdHlfb3JkX2VjKSksIAogICAgICAgICAgICAgIyB5ID0gcmVvcmRlcihjYXBhY2l0eSwgZGVzYyhjYXBhY2l0eV9vcmRfZ2gpKSwKICAgICAgICAgICAgICMgeSA9IHJlb3JkZXIoY2FwYWNpdHksIGRlc2MoY2FwYWNpdHlfb3JkX3RoKSksCiAgICAgICAgICAgICAjIHkgPSByZW9yZGVyKGNhcGFjaXR5LCBkZXNjKGNhcGFjaXR5X29yZF9jaCkpLAogICAgICAgICAgICAgIyB5ID0gcmVvcmRlcihjYXBhY2l0eSwgZGVzYyhjYXBhY2l0eV9vcmRfdnQpKSwKICAgICAgICAgICAgIGZpbGwgPSBsb2FkaW5nKSkgKwogIGZhY2V0X2dyaWQofiByZW9yZGVyKHNhbXBsZSwgYXMubnVtZXJpYyhjb3VudHJ5KSksIHNjYWxlcyA9ICJmcmVlIiwgc3BhY2UgPSAiZnJlZSIpICsKICBnZW9tX3RpbGUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC4yKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGZvcm1hdChyb3VuZChsb2FkaW5nLCAyKSwgbnNtYWxsID0gMikpLCBzaXplID0gMykgKwogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiUmRZbEJ1IiwgbGltaXRzID0gYygtMSwgMSksCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcihiYXJoZWlnaHQgPSAyMCwgYmFyd2lkdGggPSAwLjUpKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSksCiAgICAgICAgcGFuZWwuc3BhY2luZy54ID0gdW5pdCgwLjgsICJsaW5lcyIpLAogICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTAsIGZhY2UgPSAiYm9sZCIpKSArCiAgbGFicyh4ID0gTlVMTCwgeSA9ICJDYXBhY2l0eSIsIGZpbGwgPSAiRmFjdG9yXG5sb2FkaW5nIikKYGBgCgojIyBDb25ncnVlbmNlCgpTZWUgW0FsbCBzYW1wbGVzXSwgYmVsb3cuCgojIyBCb290c3RyYXBwZWQgY29uZ3J1ZW5jZQoKYGBge3IgYm9vdHN0cmFwIGNvbmdydWVuY2UgY2hpbGRyZW59CmlmIChmaWxlLmV4aXN0cygiLi4vcmVzdWx0cy9jb25nX2RmX2NoaWxkcmVuX29ibGlxdWVfZGVtb2JhbC5SRFMiKSkgewogIAogIGNvbmdfZGZfY2hpbGRyZW4gPC0gcmVhZFJEUygiLi4vcmVzdWx0cy9jb25nX2RmX2NoaWxkcmVuX29ibGlxdWVfZGVtb2JhbC5SRFMiKQogIAp9IGVsc2UgewogIAogIGJzX2NoaWxkcmVuIDwtIGxvYWRpbmdzX2NoaWxkcmVuICU+JQogICAgc2VsZWN0KGNhcGFjaXR5LCBmYWN0b3IsIGxvYWRpbmcpICU+JQogICAgc3ByZWFkKGZhY3RvciwgbG9hZGluZykgJT4lCiAgICBmdWxsX2pvaW4obG9hZGluZ3NfYWR1bHRzICU+JQogICAgICAgICAgICAgICAgc2VsZWN0KGNhcGFjaXR5LCBmYWN0b3IsIGxvYWRpbmcpICU+JQogICAgICAgICAgICAgICAgc3ByZWFkKGZhY3RvciwgbG9hZGluZykpICU+JQogICAgc2VsZWN0KC1jYXBhY2l0eSkgJT4lCiAgICBzanN0YXRzOjpib290c3RyYXAoMTAwMCkgCiAgCiAgY29uZ19kZl9jaGlsZHJlbiA8LSBkYXRhLmZyYW1lKE5VTEwpCiAgCiAgZm9yIChrIGluIGxldmVsc19jb3VudHJ5KSB7CiAgICAKICAgIGZhY3RvcnNfY2hpbGRyZW4gPC0gbGV2ZWxzKGZhY3Rvcihsb2FkaW5nc19jaGlsZHJlbiRmYWN0b3JbCiAgICAgIGxvYWRpbmdzX2NoaWxkcmVuJGNvdW50cnkgPT0ga10pKQogICAgZmFjdG9yc19hZHVsdHMgPC0gbGV2ZWxzKGZhY3Rvcihsb2FkaW5nc19hZHVsdHMkZmFjdG9yWwogICAgICBsb2FkaW5nc19hZHVsdHMkY291bnRyeSA9PSBrXSkpCiAgICAKICAgIGZvciAoaSBpbiBmYWN0b3JzX2NoaWxkcmVuKSB7CiAgICAgIGZvciAoaiBpbiBmYWN0b3JzX2FkdWx0cykgewogICAgICAgIGNuYW1lIDwtIHBhc3RlKGksIGosIHNlcCA9ICIuIikKICAgICAgICB0ZW1wIDwtIGJzX2NoaWxkcmVuICU+JQogICAgICAgICAgbXV0YXRlKGNvbmcgPSBtYXBfZGJsKHN0cmFwLCB+bHNhOjpjb3NpbmUoYXMuZGF0YS5mcmFtZSgueClbLGldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMuZGF0YS5mcmFtZSgueClbLGpdKSkpCiAgICAgICAgY29uZ19kZl9jaGlsZHJlblsxOjEwMDAsIGNuYW1lXSA8LSB0ZW1wJGNvbmcKICAgICAgfQogICAgfQogICAgCiAgICBybShpLCBqLCBjbmFtZSwgdGVtcCwgZmFjdG9yc19jaGlsZHJlbiwgZmFjdG9yc19hZHVsdHMpCiAgICAKICB9CiAgCiAgcm0oaykKICAKICBjb25nX2RmX2NoaWxkcmVuIDwtIGNvbmdfZGZfY2hpbGRyZW4gJT4lCiAgICBnYXRoZXIoZmFjdG9yX3BhaXIsIGNvbmcpICU+JQogICAgc2VwYXJhdGUoZmFjdG9yX3BhaXIsIGludG8gPSBjKCJmYWN0b3JfQSIsICJmYWN0b3JfQiIpLCBzZXAgPSAiXFwuIikgJT4lCiAgICBncm91cF9ieShmYWN0b3JfQSwgZmFjdG9yX0IpICU+JQogICAgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKGNvbmcpLAogICAgICAgICAgICAgIGNpX2xvd2VyID0gY2lfbG93ZXIoY29uZyksCiAgICAgICAgICAgICAgY2lfdXBwZXIgPSBjaV91cHBlcihjb25nKSkgJT4lCiAgICB1bmdyb3VwKCkgJT4lCiAgICBmdWxsX2pvaW4oZmFjdG9yX25hbWVzX2NoaWxkcmVuICU+JQogICAgICAgICAgICAgICAgcmVuYW1lX2FsbChmdW5zKHBhc3RlKC4sICJBIiwgc2VwID0gIl8iKSkpKSAlPiUKICAgIGZ1bGxfam9pbihmYWN0b3JfbmFtZXNfYWR1bHRzICU+JQogICAgICAgICAgICAgICAgcmVuYW1lX2FsbChmdW5zKHBhc3RlKC4sICJCIiwgc2VwID0gIl8iKSkpKSAlPiUKICAgIG11dGF0ZShmYWN0b3JfYmhtX0EgPSBjYXNlX3doZW4oCiAgICAgIGdyZXBsKCJib2R5IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQSkpIH4gIkJvZHktbGlrZVxuY2hpbGQgZmFjdG9yIiwKICAgICAgZ3JlcGwoIm1pbmQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9BKSkgfiAiTWluZC1saWtlXG5jaGlsZCBmYWN0b3IiLAogICAgICBncmVwbCgiaGVhcnQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9BKSkgfiAiSGVhcnQtbGlrZVxuY2hpbGQgZmFjdG9yIiwKICAgICAgVFJVRSB+ICJPdGhlciIpKSAlPiUKICAgIG11dGF0ZShmYWN0b3JfYmhtX0IgPSBjYXNlX3doZW4oCiAgICAgIGdyZXBsKCJib2R5IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQikpIH4gIkxvY2FsIGFkdWx0czpcbkJvZHktbGlrZSBmYWN0b3IiLAogICAgICBncmVwbCgibWluZCIsIHRvbG93ZXIoZmFjdG9yX2Rlc2NyaXB0X0IpKSB+ICJMb2NhbCBhZHVsdHM6XG5NaW5kLWxpa2UgZmFjdG9yIiwKICAgICAgZ3JlcGwoImhlYXJ0IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQikpIH4gIkxvY2FsIGFkdWx0czpcbkhlYXJ0LWxpa2UgZmFjdG9yIiwKICAgICAgVFJVRSB+ICJMb2NhbCBhZHVsdHM6XG5PdGhlciBmYWN0b3IiKSkKICAKICBzYXZlUkRTKGNvbmdfZGZfY2hpbGRyZW4sIGZpbGUgPSAiLi4vcmVzdWx0cy9jb25nX2RmX2NoaWxkcmVuX29ibGlxdWVfZGVtb2JhbC5SRFMiKQp9CmBgYAoKYGBge3IgY29uZyBtaW4gY2hpbGRyZW59CiMgZmluZCBtaW5pbXVtIHZhbHVlIHRvIHNldCBjb25zdGFudCBsb3dlciBib3VuZCBvZiBwbG90cwptaW5fY29uZ19jaGlsZHJlbiA8LSBjb25nX2RmX2NoaWxkcmVuICU+JQogIHN1bW1hcmlzZShtaW5fY29uZyA9IG1pbihjaV9sb3dlciwgbmEucm0gPSBUKSkKYGBgCgpgYGB7ciBjb25nIGNpcyBjaGlsZHJlbiwgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDEuNH0KIyBGSUdVUkUgNAojIGZpZy5hc3AgY2hvc2VuIHRvIGtlZXAgYWJzb2x1dGUgaGVpZ2h0IG9mIHktYXhpcyByZWxhdGl2ZWx5IHNpbWlsYXIgYWNyb3NzIGFkdWx0cyBhbmQgY2hpbGRyZW4KY29uZ19kZl9jaGlsZHJlbiAlPiUKICBtdXRhdGUoc2FtcGxlX0EgPSBwYXN0ZShjb3VudHJ5X0EsIGFnZV9ncm91cF9BLCBzZXAgPSAiXG4iKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gZmFjdG9yX2xhYmRlc2NyaXB0X0EsIHkgPSBtZWFuKSkgKwogIGZhY2V0X2dyaWQoZmFjdG9yX2JobV9CIH4gcmVvcmRlcihzYW1wbGVfQSwgYXMubnVtZXJpYyhjb3VudHJ5X0EpKSwgCiAgICAgICAgICAgICBzY2FsZXMgPSAiZnJlZV94Iiwgc3BhY2UgPSAiZnJlZV94IikgKwogIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLCB5bWF4ID0gMC44NSwKICAgICAgICAgICBmaWxsID0gImdyYXkyMCIsIGFscGhhID0gMC4yKSArCiAgYW5ub3RhdGUoInJlY3QiLCB4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IDAuODUsIHltYXggPSAwLjk1LAogICAgICAgICAgIGZpbGwgPSB2aXJpZGlzTGl0ZTo6dmlyaWRpcygyLCBiZWdpbiA9IDAuNzUvMiwgZW5kID0gMC43NSlbMV0sIGFscGhhID0gMC4yKSArCiAgYW5ub3RhdGUoInJlY3QiLCB4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IDAuOTUsIHltYXggPSBJbmYsCiAgICAgICAgICAgZmlsbCA9IHZpcmlkaXNMaXRlOjp2aXJpZGlzKDIsIGJlZ2luID0gMC43NS8yLCBlbmQgPSAwLjc1KVsyXSwgYWxwaGEgPSAwLjIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjg1LCBsdHkgPSAyLCBjb2xvciA9ICJncmF5MTAiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC45NSwgbHR5ID0gMiwgY29sb3IgPSAiZ3JheTEwIikgKwogIGdlb21fcG9pbnRyYW5nZShhZXMoeW1pbiA9IGNpX2xvd2VyLCB5bWF4ID0gY2lfdXBwZXIpLAogICAgICAgICAgICAgICAgICBmYXR0ZW4gPSAzLAogICAgICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEYpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gZm9ybWF0KHJvdW5kKG1lYW4sIDIpLCBuc21hbGwgPSAyKSwKICAgICAgICAgICAgICAgIHkgPSBpZmVsc2UoY2lfbG93ZXIgPCAwLjIsIGNpX3VwcGVyICsgMC4wNSwgY2lfbG93ZXIgLSAwLjA1KSwKICAgICAgICAgICAgICAgIHZqdXN0ID0gaWZlbHNlKGNpX2xvd2VyIDwgMC4yLCAwLCAxKSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKC0xLCAxLCAwLjIpLAogICAgICAgICAgICAgICAgICAgICBleHBhbmQgPSBleHBhbnNpb24oYWRkID0gMC4wNSkpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIsIGFlc3RoZXRpY3MgPSBjKCJjb2xvciIsICJmaWxsIikpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gMjE6MjUpICsKICBsYWJzKHggPSBOVUxMLAogICAgICAgeSA9IGV4cHJlc3Npb24oIlNpbWlsYXJpdHkgIihpdGFsaWMocltjXSkpKSkgKyAKICBndWlkZXMoY29sb3IgPSAibm9uZSIsIGZpbGwgPSAibm9uZSIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLAogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsID0gc2NhbGVzOjphbHBoYSgid2hpdGUiLCAwKSwgY29sb3IgPSAiYmxhY2siKSwKICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgZmFjZSA9ICJib2xkIiksIAogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDUuNSwgNS41LCA1LjUsIDE1LjUpLCAicG9pbnQiKSkKZ2dzYXZlKCIuLi9maWd1cmVzL2ZpZzA0X29ibGlxdWVfZGVtb2JhbC5wbmciKQpgYGAKCmBgYHtyIGJvZHkgbWluZCBjb25nIGNoaWxkcmVufQojICJJbiBlYWNoIHNhbXBsZSwgdGhlcmUgd2FzIGEgZmFjdG9yIHRoYXQgd2FzIG11Y2ggbW9yZSBzaW1pbGFyIHRvIGxvY2FsIGFkdWx0c+KAmSDigJxib2R5LWxpa2XigJ0gZmFjdG9yLi4uCmNvbmdfZGZfY2hpbGRyZW4gJT4lIAogIGZpbHRlcihncmVwbCgiYm9keSIsIHRvbG93ZXIoZmFjdG9yX2JobV9BKSksIAogICAgICAgICBncmVwbCgiYm9keSIsIHRvbG93ZXIoZmFjdG9yX2JobV9CKSkpCgojICIuLi50aGFuIHRoZWlyIOKAnG1pbmQtbGlrZeKAnSBmYWN0b3IsIC4uLgpjb25nX2RmX2NoaWxkcmVuICU+JSAKICBmaWx0ZXIoZ3JlcGwoImJvZHkiLCB0b2xvd2VyKGZhY3Rvcl9iaG1fQSkpLCAKICAgICAgICAgZ3JlcGwoIm1pbmQiLCB0b2xvd2VyKGZhY3Rvcl9iaG1fQikpKQoKIyAiLi4uIGFuZCBhIGZhY3RvciB0aGF0IHdhcyBtdWNoIG1vcmUgc2ltaWxhciB0byBsb2NhbCBhZHVsdHPigJkg4oCcbWluZC1saWtl4oCdIGZhY3Rvci4uLgpjb25nX2RmX2NoaWxkcmVuICU+JSAKICBmaWx0ZXIoZ3JlcGwoIm1pbmQiLCB0b2xvd2VyKGZhY3Rvcl9iaG1fQSkpLCAKICAgICAgICAgZ3JlcGwoIm1pbmQiLCB0b2xvd2VyKGZhY3Rvcl9iaG1fQikpKQoKIyAiLi4udGhhbiB0aGVpciDigJxib2R5LWxpa2XigJ0gZmFjdG9yLiIKY29uZ19kZl9jaGlsZHJlbiAlPiUgCiAgZmlsdGVyKGdyZXBsKCJtaW5kIiwgdG9sb3dlcihmYWN0b3JfYmhtX0EpKSwgCiAgICAgICAgIGdyZXBsKCJib2R5IiwgdG9sb3dlcihmYWN0b3JfYmhtX0IpKSkKYGBgCgoKIyBBbGwgc2FtcGxlcwoKIyMgQ29uZ3J1ZW5jZQoKYGBge3IgY29uZ3J1ZW5jZSBhbGwgc2FtcGxlc30KY29uZ19hbGwgPC0gZmEuY29uZ3J1ZW5jZSh4ID0gbGlzdChlZmFfdXNfYWR1bHRzJGxvYWRpbmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmYV9naF9hZHVsdHMkbG9hZGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZhX3RoX2FkdWx0cyRsb2FkaW5ncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmFfY2hfYWR1bHRzJGxvYWRpbmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmYV92dF9hZHVsdHMkbG9hZGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZhX3VzX2NoaWxkcmVuJGxvYWRpbmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmYV9naF9jaGlsZHJlbiRsb2FkaW5ncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmFfdGhfY2hpbGRyZW4kbG9hZGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZhX2NoX2NoaWxkcmVuJGxvYWRpbmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmYV92dF9jaGlsZHJlbiRsb2FkaW5ncyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGlnaXRzID0gNSkgJT4lCiAgIyBnZXRfdXBwZXJfdHJpX2Z1bigpICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oImZhY3Rvcl9BIikgJT4lCiAgZ2F0aGVyKGZhY3Rvcl9CLCBjb25nLCAtZmFjdG9yX0EpICU+JQogIGxlZnRfam9pbihiaW5kX3Jvd3MoZmFjdG9yX25hbWVzX2FkdWx0cyAlPiUgCiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZV9hbGwoZnVucyhwYXN0ZSguLCAiQSIsIHNlcCA9ICJfIikpKSwKICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lc19jaGlsZHJlbiAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgcmVuYW1lX2FsbChmdW5zKHBhc3RlKC4sICJBIiwgc2VwID0gIl8iKSkpKSkgJT4lCiAgbGVmdF9qb2luKGJpbmRfcm93cyhmYWN0b3JfbmFtZXNfYWR1bHRzICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgcmVuYW1lX2FsbChmdW5zKHBhc3RlKC4sICJCIiwgc2VwID0gIl8iKSkpLAogICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX25hbWVzX2NoaWxkcmVuICU+JQogICAgICAgICAgICAgICAgICAgICAgICByZW5hbWVfYWxsKGZ1bnMocGFzdGUoLiwgIkIiLCBzZXAgPSAiXyIpKSkpKQpgYGAKCmBgYHtyIGNvbmcgYWxsIHBhaXJzIGZvcm1hdH0KIyBtYWtlIHdpZGUtZm9ybSB2ZXJzaW9uIG9mIGRmCmNvbmdfYWxsX3cgPC0gY29uZ19hbGwgJT4lCiAgc2VsZWN0KGZhY3Rvcl9BLCBmYWN0b3JfQiwgY29uZykgJT4lCiAgc3ByZWFkKGZhY3Rvcl9CLCBjb25nKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXMoImZhY3Rvcl9BIikKCiMgdHJlYXQgc2ltaWxhcml0eSBtYXRyaXggYXMgaWYgaXQgd2VyZSB0aGUgY29ycmVsYXRpb24gbWF0cml4IGZvciBoY2x1c3QKcm93Lm9yZGVyIDwtIGhjbHVzdChhcy5kaXN0KCgxIC0gY29uZ19hbGxfdykvMikpJG9yZGVyCmNvbC5vcmRlciA8LSBoY2x1c3QoYXMuZGlzdCh0KCgxIC0gY29uZ19hbGxfdykvMikpKSRvcmRlcgoKIyByZS1vcmRlciBtYXRyaXggYWNjb3JpbmcgdG8gY2x1c3RlcmluZwpjb25nX2FsbF93IDwtIGNvbmdfYWxsX3dbcm93Lm9yZGVyLCBjb2wub3JkZXJdIAoKIyBmb3Igc29tZSByZWFzb24gcmVzaGFwZTI6Om1lbHQoKSB3b3JrcyBiZXR0ZXIgdGhhbiBjdXJyZW50IHRpZHl2ZXJzZSBmdW5jdGlvbnMuLi4KY29uZ19hbGxfb3JkZXJlZCA8LSBtZWx0KGFzLm1hdHJpeChjb25nX2FsbF93KSkgJT4lCiAgcmVuYW1lKGZhY3Rvcl9BX29yZGVyZWQgPSBWYXIxLCAKICAgICAgICAgZmFjdG9yX0Jfb3JkZXJlZCA9IFZhcjIsCiAgICAgICAgIGNvbmcgPSB2YWx1ZSkgJT4lCiAgbXV0YXRlKGZhY3Rvcl9BID0gYXMuY2hhcmFjdGVyKGZhY3Rvcl9BX29yZGVyZWQpLAogICAgICAgICBmYWN0b3JfQiA9IGFzLmNoYXJhY3RlcihmYWN0b3JfQl9vcmRlcmVkKSkgJT4lCiAgZnVsbF9qb2luKGNvbmdfYWxsICU+JSBzZWxlY3QoY29udGFpbnMoIl9BIikpICU+JSBkaXN0aW5jdCgpKSAlPiUKICBmdWxsX2pvaW4oY29uZ19hbGwgJT4lIHNlbGVjdChjb250YWlucygiX0IiKSkgJT4lIGRpc3RpbmN0KCkpICU+JQogIG11dGF0ZShsYWJfQSA9IHBhc3RlKHBhc3RlKGNvdW50cnlfQSwgYWdlX2dyb3VwX0EpLCBmYWN0b3JfbGFiZGVzY3JpcHRfQSwgc2VwID0gIiwgIiksCiAgICAgICAgIGxhYl9CID0gcGFzdGUocGFzdGUoY291bnRyeV9CLCBhZ2VfZ3JvdXBfQiksIGZhY3Rvcl9sYWJkZXNjcmlwdF9CLCBzZXAgPSAiLCAiKSkKIyBtdXRhdGUoc2FtcGxlX0EgPSBwYXN0ZShjb3VudHJ5X0EsIGFnZV9ncm91cF9BLCBzZXAgPSAiLCAiKSwKIyAgICAgICAgc2FtcGxlX0IgPSBwYXN0ZShjb3VudHJ5X0IsIGFnZV9ncm91cF9CLCBzZXAgPSAiLCAiKSwKIyAgICAgICAgbGFiX0EgPSBwYXN0ZShzYW1wbGVfQSwgZmFjdG9yX2xhYmRlc2NyaXB0X0EsIHNlcCA9ICIgIiksCiMgICAgICAgIGxhYl9CID0gcGFzdGUoc2FtcGxlX0IsIGZhY3Rvcl9sYWJkZXNjcmlwdF9CLCBzZXAgPSAiICIpKQpgYGAKCmBgYHtyIGNvbmcgYWxsIHBhaXJzIHBsb3QsIGZpZy53aWR0aCA9IDkuNSwgZmlnLmFzcCA9IDAuOX0KIyBGSUdVUkUgMgpjb25nX2xvd2VyX2xpbSA8LSBpZmVsc2UobWluKGNvbmdfYWxsX29yZGVyZWQkY29uZykgPiAtMC4wNSwgLTAuMDUsIAogICAgICAgICAgICAgICAgICAgICAgICAgbWluKGNvbmdfYWxsX29yZGVyZWQkY29uZykpCiMgY29uZ19wbG90X2NvbG9ycyA8LSBjKCJyZWQ0IiwgImJsdWU0IiwgImRhcmtvcmNoaWQ0IiwgImJsYWNrIikKIyBjb25nX3Bsb3RfY29sb3JzIDwtIGMoImJsYWNrIiwgImJsYWNrIiwgImJsYWNrIiwgImJsYWNrIikKY29uZ19wbG90X2NvbG9ycyA8LSBjKCJyZWQ0IiwgInJlZDQiLCAicmVkNCIsICJibGFjayIpCgpjb25nX2FsbF9vcmRlcmVkICU+JQogIGdncGxvdChhZXMoeCA9IHJlb3JkZXIobGFiX0EsIGFzLm51bWVyaWMoZmFjdG9yX0Ffb3JkZXJlZCkpLAogICAgICAgICAgICAgeSA9IHJlb3JkZXIobGFiX0IsIGFzLm51bWVyaWMoZGVzYyhmYWN0b3JfQl9vcmRlcmVkKSkpLAogICAgICAgICAgICAgZmlsbCA9IGNvbmcpKSArIAogIGdlb21fdGlsZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gZm9ybWF0KHJvdW5kKGNvbmcsIDIpLCBuc21hbGwgPSAyKSwKICAgICAgICAgICAgICAgIGNvbG9yID0gY2FzZV93aGVuKGNvbmcgPiAwLjg1IH4gImEiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmcgPiAwLjc1IH4gImIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZyA+IDAuNjUgfiAiYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gImQiKSksCiAgICAgICAgICAgIHNob3cubGVnZW5kID0gRikgKwogICMgYm9keS1saWtlIGZhY3RvcnMKICBhbm5vdGF0ZSgicmVjdCIsIHhtaW4gPSA1LjUsIHhtYXggPSAxNS41LCB5bWluID0gMTYuNSwgeW1heCA9IDI2LjUsCiAgICAgICAgICAgY29sb3IgPSBjb25nX3Bsb3RfY29sb3JzWzFdLCBzaXplID0gMS41LCBhbHBoYSA9IDApICsKICAjIG1pbmQtbGlrZSBmYWN0b3JzCiAgYW5ub3RhdGUoInJlY3QiLCB4bWluID0gMTUuNSwgeG1heCA9IDI1LjUsIHltaW4gPSA2LjUsIHltYXggPSAxNi41LAogICAgICAgICAgIGNvbG9yID0gY29uZ19wbG90X2NvbG9yc1syXSwgc2l6ZSA9IDEuNSwgYWxwaGEgPSAwKSArCiAgIyBoZWFydC1saWtlIGZhY3RvcnMKICBhbm5vdGF0ZSgicmVjdCIsIHhtaW4gPSAyNS41LCB4bWF4ID0gMzEuNSwgeW1pbiA9IDAuNSwgeW1heCA9IDYuNSwKICAgICAgICAgICBjb2xvciA9IGNvbmdfcGxvdF9jb2xvcnNbM10sIHNpemUgPSAxLjUsIGFscGhhID0gMCkgKwogICMgc2NhbGVfZmlsbF92aXJpZGlzX2ModHJhbnMgPSBzY2FsZXM6OmV4cF90cmFucyhiYXNlID0gZXhwKDEpKSwKICAjICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoY29uZ19sb3dlcl9saW0sIDEpLCAKICAjICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IHNlcShjb25nX2xvd2VyX2xpbSwgMSwgMC4wNSksCiAgIyAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKGZvcm1hdChzZXEoY29uZ19sb3dlcl9saW0sIDAuOCwgMC4wNSksIG5zbWFsbCA9IDIpLAogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMC44NSA9IG1vZGVyYXRlIiwgIjAuOTAiLCAKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjAuOTUgPSBoaWdoIiwgIjEuMDAiKSwKICAjICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiA9ICJ2aXJpZGlzIiwKICAjICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIoYmFyaGVpZ2h0ID0gNDApKSArCiAgc2NhbGVfZmlsbF9ncmFkaWVudG4oI3RyYW5zID0gc2NhbGVzOjpleHBfdHJhbnMoYmFzZSA9IGV4cCgxKSksCiAgICBsaW1pdHMgPSBjKGNvbmdfbG93ZXJfbGltLCAxKSwgCiAgICBicmVha3MgPSBzZXEoY29uZ19sb3dlcl9saW0sIDEsIDAuMDUpLAogICAgbGFiZWxzID0gYyhmb3JtYXQoc2VxKGNvbmdfbG93ZXJfbGltLCAwLjgsIDAuMDUpLCBuc21hbGwgPSAyKSwKICAgICAgICAgICAgICAgIjAuODUgPSBtb2RlcmF0ZSIsICIwLjkwIiwgCiAgICAgICAgICAgICAgICIwLjk1ID0gaGlnaCIsICIxLjAwIiksCiAgICBjb2xvcnMgPSB2aXJpZGlzTGl0ZTo6dmlyaWRpcyg2KSwKICAgIHZhbHVlcyA9IGMoMCwgMC42NSwgMC43NSwgMC44NSwgMC45NSwgMSksCiAgICBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKGJhcmhlaWdodCA9IDQwKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJibGFjayIsICJibGFjayIsICJibGFjayIsICJncmF5NjAiKSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dCgKICAgICAgIyBhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSwKICAgICAgYW5nbGUgPSA5MCwgaGp1c3QgPSAxLCB2anVzdCA9IDEsCiAgICAgIHNpemUgPSBzaXplX2Z1bihjb25nX2FsbF9vcmRlcmVkJGxhYl9BLCBzaXplcyA9IGMoMjAsIDE0KSksCiAgICAgIGNvbG9yID0gY29sb3JfZnVuKGNvbmdfYWxsX29yZGVyZWQkbGFiX0EsIGNvbG9yX2xpc3QgPSBjb25nX3Bsb3RfY29sb3JzKSwKICAgICAgZmFjZSAgPSBmYWNlX2Z1bihjb25nX2FsbF9vcmRlcmVkJGxhYl9BKSksCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IHJldihzaXplX2Z1bihjb25nX2FsbF9vcmRlcmVkJGxhYl9BLCBzaXplcyA9IGMoMjAsIDE0KSkpLAogICAgICBjb2xvciA9IHJldihjb2xvcl9mdW4oY29uZ19hbGxfb3JkZXJlZCRsYWJfQSwgY29sb3JfbGlzdCA9IGNvbmdfcGxvdF9jb2xvcnMpKSwKICAgICAgZmFjZSAgPSByZXYoZmFjZV9mdW4oY29uZ19hbGxfb3JkZXJlZCRsYWJfQSkpKSwKICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplID0gMjApLAogICAgIyBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKHNpemUgPSAwLjUpLAogICAgYXhpcy50aWNrcy54ID0gZWxlbWVudF9saW5lKAogICAgICBzaXplID0gc2l6ZV9mdW4oY29uZ19hbGxfb3JkZXJlZCRsYWJfQSwgc2l6ZXMgPSBjKDEuNSwgMC41KSksCiAgICAgIGNvbG9yID0gY29sb3JfZnVuKGNvbmdfYWxsX29yZGVyZWQkbGFiX0EsIGNvbG9yX2xpc3QgPSBjb25nX3Bsb3RfY29sb3JzKSksCiAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2xpbmUoCiAgICAgIHNpemUgPSByZXYoc2l6ZV9mdW4oY29uZ19hbGxfb3JkZXJlZCRsYWJfQSwgc2l6ZXMgPSBjKDEuNSwgMC41KSkpLAogICAgICBjb2xvciA9IHJldihjb2xvcl9mdW4oY29uZ19hbGxfb3JkZXJlZCRsYWJfQSwgY29sb3JfbGlzdCA9IGNvbmdfcGxvdF9jb2xvcnMpKSksCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoMC4yNSwgImNtIikpICsKICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCwgZmlsbCA9IGV4cHJlc3Npb24oaXRhbGljKHJbY10pKSkKZ2dzYXZlKCIuLi9maWd1cmVzL2ZpZzAyX29ibGlxdWVfZGVtb2JhbC5wbmciKQpgYGAKCiMjIEphY2NhcmQgU2ltaWxhcml0eQoKYGBge3IgamFjY2FyZCBhbGwgc2FtcGxlc30Kc3Ryb25nX2xvYWRfYWxsIDwtIGxvYWRpbmdzX2FkdWx0cyAlPiUKICBiaW5kX3Jvd3MobG9hZGluZ3NfY2hpbGRyZW4pICU+JQogIHNlbGVjdChjb3VudHJ5LCBhZ2VfZ3JvdXAsIGZhY3RvciwgY2FwYWNpdHksIGxvYWRpbmcpICU+JQogIG11dGF0ZShzdHJvbmdfbG9hZCA9IGlmZWxzZShsb2FkaW5nID49IDAuNSwgMSwgMCkpICU+JQogIHNlbGVjdCgtbG9hZGluZykKCmNyb3NzX2xvYWRfYWxsIDwtIHN0cm9uZ19sb2FkX2FsbCAlPiUKICBmaWx0ZXIoc3Ryb25nX2xvYWQgPT0gMSkgJT4lCiAgY291bnQoY291bnRyeSwgYWdlX2dyb3VwLCBjYXBhY2l0eSwgc3Ryb25nX2xvYWQpICU+JQogIGZpbHRlcihuID4gMSkgJT4lCiAgbXV0YXRlKGNyb3NzX2xvYWQgPSBUKSAlPiUKICBzZWxlY3QoY291bnRyeSwgYWdlX2dyb3VwLCBjYXBhY2l0eSwgY3Jvc3NfbG9hZCkKCnN0cm9uZ19ub25jcm9zc19sb2FkX2FsbCA8LSBzdHJvbmdfbG9hZF9hbGwgJT4lCiAgbGVmdF9qb2luKGNyb3NzX2xvYWRfYWxsKSAlPiUKICBmaWx0ZXIoaXMubmEoY3Jvc3NfbG9hZCkpCgpqYWNjYXJkX2FsbCA8LSBzdHJvbmdfbm9uY3Jvc3NfbG9hZF9hbGwgJT4lCiAgc2VsZWN0KGZhY3RvciwgY2FwYWNpdHksIHN0cm9uZ19sb2FkKSAlPiUKICBzcHJlYWQoZmFjdG9yLCBzdHJvbmdfbG9hZCkgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKCJjYXBhY2l0eSIpICU+JQogIHQoKSAlPiUKICBkaXN0KG1ldGhvZCA9ICJiaW5hcnkiLCBkaWFnID0gVCwgdXBwZXIgPSBUKSAlPiUKICBhcy5tYXRyaXgoKSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJmYWN0b3JfQSIpICU+JQogIGdhdGhlcihmYWN0b3JfQiwgamFjY2FyZCwgLWZhY3Rvcl9BKSAlPiUKICAjIGNvbXB1dGUgc2ltaWxhcml0eSBpbmRleCBpbnN0ZWFkIG9mIGRpc3RhbmNlCiAgbXV0YXRlKGphY2NhcmQgPSAxIC0gamFjY2FyZCkgJT4lCiAgbGVmdF9qb2luKGJpbmRfcm93cyhmYWN0b3JfbmFtZXNfYWR1bHRzICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgcmVuYW1lX2FsbChmdW5zKHBhc3RlKC4sICJBIiwgc2VwID0gIl8iKSkpLAogICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX25hbWVzX2NoaWxkcmVuICU+JQogICAgICAgICAgICAgICAgICAgICAgICByZW5hbWVfYWxsKGZ1bnMocGFzdGUoLiwgIkEiLCBzZXAgPSAiXyIpKSkpKSAlPiUKICBsZWZ0X2pvaW4oYmluZF9yb3dzKGZhY3Rvcl9uYW1lc19hZHVsdHMgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICByZW5hbWVfYWxsKGZ1bnMocGFzdGUoLiwgIkIiLCBzZXAgPSAiXyIpKSksCiAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXNfY2hpbGRyZW4gJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZV9hbGwoZnVucyhwYXN0ZSguLCAiQiIsIHNlcCA9ICJfIikpKSkpCmBgYAoKYGBge3IgamFjY2FyZCBhbGwgcGFpcnMgZm9ybWF0fQojIG1ha2Ugd2lkZS1mb3JtIHZlcnNpb24gb2YgZGYKamFjY2FyZF9hbGxfdyA8LSBqYWNjYXJkX2FsbCAlPiUKICBzZWxlY3QoZmFjdG9yX0EsIGZhY3Rvcl9CLCBqYWNjYXJkKSAlPiUKICBzcHJlYWQoZmFjdG9yX0IsIGphY2NhcmQpICU+JQogIGNvbHVtbl90b19yb3duYW1lcygiZmFjdG9yX0EiKQoKIyB0cmVhdCBkaXN0YW5jZSBtYXRyaXggYXMgaWYgaXQgd2VyZSB0aGUgY29ycmVsYXRpb24gbWF0cml4IGZvciBoY2x1c3QKcm93Lm9yZGVyIDwtIGhjbHVzdChhcy5kaXN0KCgxIC0gamFjY2FyZF9hbGxfdykvMikpJG9yZGVyCmNvbC5vcmRlciA8LSBoY2x1c3QoYXMuZGlzdCh0KCgxIC0gamFjY2FyZF9hbGxfdykvMikpKSRvcmRlcgoKIyByZS1vcmRlciBtYXRyaXggYWNjb3JpbmcgdG8gY2x1c3RlcmluZwpqYWNjYXJkX2FsbF93IDwtIGphY2NhcmRfYWxsX3dbcm93Lm9yZGVyLCBjb2wub3JkZXJdIAoKIyBmb3Igc29tZSByZWFzb24gcmVzaGFwZTI6Om1lbHQoKSB3b3JrcyBiZXR0ZXIgdGhhbiBjdXJyZW50IHRpZHl2ZXJzZSBmdW5jdGlvbnMuLi4KamFjY2FyZF9hbGxfb3JkZXJlZCA8LSBtZWx0KGFzLm1hdHJpeChqYWNjYXJkX2FsbF93KSkgJT4lCiAgcmVuYW1lKGZhY3Rvcl9BX29yZGVyZWQgPSBWYXIxLCAKICAgICAgICAgZmFjdG9yX0Jfb3JkZXJlZCA9IFZhcjIsCiAgICAgICAgIGphY2NhcmQgPSB2YWx1ZSkgJT4lCiAgbXV0YXRlKGZhY3Rvcl9BID0gYXMuY2hhcmFjdGVyKGZhY3Rvcl9BX29yZGVyZWQpLAogICAgICAgICBmYWN0b3JfQiA9IGFzLmNoYXJhY3RlcihmYWN0b3JfQl9vcmRlcmVkKSkgJT4lCiAgZnVsbF9qb2luKGphY2NhcmRfYWxsICU+JSBzZWxlY3QoY29udGFpbnMoIl9BIikpICU+JSBkaXN0aW5jdCgpKSAlPiUKICBmdWxsX2pvaW4oamFjY2FyZF9hbGwgJT4lIHNlbGVjdChjb250YWlucygiX0IiKSkgJT4lIGRpc3RpbmN0KCkpICU+JQogIG11dGF0ZShsYWJfQSA9IHBhc3RlKHBhc3RlKGNvdW50cnlfQSwgYWdlX2dyb3VwX0EpLCBmYWN0b3JfbGFiZGVzY3JpcHRfQSwgc2VwID0gIiwgIiksCiAgICAgICAgIGxhYl9CID0gcGFzdGUocGFzdGUoY291bnRyeV9CLCBhZ2VfZ3JvdXBfQiksIGZhY3Rvcl9sYWJkZXNjcmlwdF9CLCBzZXAgPSAiLCAiKSkKIyBtdXRhdGUoc2FtcGxlX0EgPSBwYXN0ZShjb3VudHJ5X0EsIGFnZV9ncm91cF9BLCBzZXAgPSAiLCAiKSwKIyAgICAgICAgc2FtcGxlX0IgPSBwYXN0ZShjb3VudHJ5X0IsIGFnZV9ncm91cF9CLCBzZXAgPSAiLCAiKSwKIyAgICAgICAgbGFiX0EgPSBwYXN0ZShzYW1wbGVfQSwgZmFjdG9yX2xhYmRlc2NyaXB0X0EsIHNlcCA9ICIgIiksCiMgICAgICAgIGxhYl9CID0gcGFzdGUoc2FtcGxlX0IsIGZhY3Rvcl9sYWJkZXNjcmlwdF9CLCBzZXAgPSAiICIpKQpgYGAKCmBgYHtyIGphY2NhcmQgYWxsIHBhaXJzIHBsb3QsIGZpZy53aWR0aCA9IDkuNSwgZmlnLmFzcCA9IDAuOX0KIyBGSUdVUkUgMiBlcXVpdmFsZW50CmphY2NhcmRfbG93ZXJfbGltIDwtIGlmZWxzZShtaW4oamFjY2FyZF9hbGxfb3JkZXJlZCRqYWNjYXJkKSA+IDAsIDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgbWluKGphY2NhcmRfYWxsX29yZGVyZWQkamFjY2FyZCkpCiMgamFjY2FyZF9wbG90X2NvbG9ycyA8LSBjKCJyZWQ0IiwgImJsdWU0IiwgImRhcmtvcmNoaWQ0IiwgImJsYWNrIikKIyBqYWNjYXJkX3Bsb3RfY29sb3JzIDwtIGMoImJsYWNrIiwgImJsYWNrIiwgImJsYWNrIiwgImJsYWNrIikKamFjY2FyZF9wbG90X2NvbG9ycyA8LSBjKCJyZWQ0IiwgInJlZDQiLCAicmVkNCIsICJibGFjayIpCgpqYWNjYXJkX2FsbF9vcmRlcmVkICU+JQogIGdncGxvdChhZXMoeCA9IHJlb3JkZXIobGFiX0EsIGFzLm51bWVyaWMoZmFjdG9yX0Ffb3JkZXJlZCkpLAogICAgICAgICAgICAgeSA9IHJlb3JkZXIobGFiX0IsIGFzLm51bWVyaWMoZGVzYyhmYWN0b3JfQl9vcmRlcmVkKSkpLAogICAgICAgICAgICAgZmlsbCA9IGphY2NhcmQpKSArIAogIGdlb21fdGlsZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY2FzZV93aGVuKAogICAgIyBqYWNjYXJkICVpbiUgYygwLCAxKSB+IGZvcm1hdChyb3VuZChqYWNjYXJkLCAwKSwgbnNtYWxsID0gMCksCiAgICBUUlVFIH4gZm9ybWF0KHJvdW5kKGphY2NhcmQsIDIpLCBuc21hbGwgPSAyKSksCiAgICBjb2xvciA9IGNhc2Vfd2hlbihqYWNjYXJkID49IDAuNzUgfiAiYSIsIAogICAgICAgICAgICAgICAgICAgICAgamFjY2FyZCA+PSAwLjUgfiAiYiIsCiAgICAgICAgICAgICAgICAgICAgICBqYWNjYXJkID49IDAuMjUgfiAiYyIsCiAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gImQiKSksCiAgICBzaG93LmxlZ2VuZCA9IEYpICsKICAjIG1pbmQtbGlrZSBhbmQgb3RoZXIgZmFjdG9ycwogIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IDAuNSwgeG1heCA9IDE0LjUsIHltaW4gPSAxNy41LCB5bWF4ID0gMzEuNSwKICAgICAgICAgICBjb2xvciA9IGphY2NhcmRfcGxvdF9jb2xvcnNbMl0sIHNpemUgPSAxLjUsIGFscGhhID0gMCkgKwogICMgYm9keS1saWtlIGZhY3RvcnMKICBhbm5vdGF0ZSgicmVjdCIsIHhtaW4gPSAxNC41LCB4bWF4ID0gMjQuNSwgeW1pbiA9IDcuNSwgeW1heCA9IDE3LjUsCiAgICAgICAgICAgY29sb3IgPSBqYWNjYXJkX3Bsb3RfY29sb3JzWzFdLCBzaXplID0gMS41LCBhbHBoYSA9IDApICsKICAjIGhlYXJ0LWxpa2UgZmFjdG9ycwogIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IDI0LjUsIHhtYXggPSAzMS41LCB5bWluID0gMC41LCB5bWF4ID0gNy41LAogICAgICAgICAgIGNvbG9yID0gamFjY2FyZF9wbG90X2NvbG9yc1szXSwgc2l6ZSA9IDEuNSwgYWxwaGEgPSAwKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzX2MoI3RyYW5zID0gc2NhbGVzOjpleHBfdHJhbnMoYmFzZSA9IGV4cCgxKSksCiAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhqYWNjYXJkX2xvd2VyX2xpbSwgMSksCiAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKGphY2NhcmRfbG93ZXJfbGltLCAxLCAwLjA1KSwKICAgICAgICAgICAgICAgICAgICAgICAjIGxhYmVscyA9IGMoZm9ybWF0KHNlcShqYWNjYXJkX2xvd2VyX2xpbSwgMC44LCAwLjA1KSwgCiAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICBuc21hbGwgPSAyKSwKICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgIjAuODUgPSBtb2RlcmF0ZSIsICIwLjkwIiwKICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgIjAuOTUgPSBoaWdoIiwgIjEuMDAiKSwKICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24gPSAidmlyaWRpcyIsIAogICAgICAgICAgICAgICAgICAgICAgICMgZGlyZWN0aW9uID0gLTEsCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcihiYXJoZWlnaHQgPSA0MCkpICsKICAjIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKCN0cmFucyA9IHNjYWxlczo6ZXhwX3RyYW5zKGJhc2UgPSBleHAoMSkpLAogICMgICBsaW1pdHMgPSBjKGphY2NhcmRfbG93ZXJfbGltLCAxKSwgCiAgIyAgIGJyZWFrcyA9IHNlcShqYWNjYXJkX2xvd2VyX2xpbSwgMSwgMC4wNSksCiAgIyAgIGxhYmVscyA9IGMoZm9ybWF0KHNlcShqYWNjYXJkX2xvd2VyX2xpbSwgMC44LCAwLjA1KSwgbnNtYWxsID0gMiksCiAgIyAgICAgICAgICAgICAgIjAuODUgPSBtb2RlcmF0ZSIsICIwLjkwIiwgCiAgIyAgICAgICAgICAgICAgIjAuOTUgPSBoaWdoIiwgIjEuMDAiKSwKICAjICAgY29sb3JzID0gdmlyaWRpc0xpdGU6OnZpcmlkaXMoNiksCiAgIyAgIHZhbHVlcyA9IGMoMCwgMC42NSwgMC43NSwgMC44NSwgMC45NSwgMSksCiAgIyAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIoYmFyaGVpZ2h0ID0gNDApKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImJsYWNrIiwgImJsYWNrIiwgImJsYWNrIiwgImdyYXk2MCIpKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZSgKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KAogICAgICAjIGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxLAogICAgICBhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHZqdXN0ID0gMSwKICAgICAgc2l6ZSA9IHNpemVfZnVuKGphY2NhcmRfYWxsX29yZGVyZWQkbGFiX0EsIHNpemVzID0gYygyMCwgMTQpKSwKICAgICAgY29sb3IgPSBjb2xvcl9mdW4oamFjY2FyZF9hbGxfb3JkZXJlZCRsYWJfQSwgY29sb3JfbGlzdCA9IGphY2NhcmRfcGxvdF9jb2xvcnMpLAogICAgICBmYWNlICA9IGZhY2VfZnVuKGphY2NhcmRfYWxsX29yZGVyZWQkbGFiX0EpKSwKICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KAogICAgICBzaXplID0gcmV2KHNpemVfZnVuKGphY2NhcmRfYWxsX29yZGVyZWQkbGFiX0EsIHNpemVzID0gYygyMCwgMTQpKSksCiAgICAgIGNvbG9yID0gcmV2KGNvbG9yX2Z1bihqYWNjYXJkX2FsbF9vcmRlcmVkJGxhYl9BLCBjb2xvcl9saXN0ID0gamFjY2FyZF9wbG90X2NvbG9ycykpLAogICAgICBmYWNlICA9IHJldihmYWNlX2Z1bihqYWNjYXJkX2FsbF9vcmRlcmVkJGxhYl9BKSkpLAogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemUgPSAyMCksCiAgICAjIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoc2l6ZSA9IDAuNSksCiAgICBheGlzLnRpY2tzLnggPSBlbGVtZW50X2xpbmUoCiAgICAgIHNpemUgPSBzaXplX2Z1bihqYWNjYXJkX2FsbF9vcmRlcmVkJGxhYl9BLCBzaXplcyA9IGMoMS41LCAwLjUpKSwKICAgICAgY29sb3IgPSBjb2xvcl9mdW4oamFjY2FyZF9hbGxfb3JkZXJlZCRsYWJfQSwgY29sb3JfbGlzdCA9IGphY2NhcmRfcGxvdF9jb2xvcnMpKSwKICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfbGluZSgKICAgICAgc2l6ZSA9IHJldihzaXplX2Z1bihqYWNjYXJkX2FsbF9vcmRlcmVkJGxhYl9BLCBzaXplcyA9IGMoMS41LCAwLjUpKSksCiAgICAgIGNvbG9yID0gcmV2KGNvbG9yX2Z1bihqYWNjYXJkX2FsbF9vcmRlcmVkJGxhYl9BLCBjb2xvcl9saXN0ID0gamFjY2FyZF9wbG90X2NvbG9ycykpKSwKICAgIGF4aXMudGlja3MubGVuZ3RoID0gdW5pdCgwLjI1LCAiY20iKSkgKwogIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMLCBmaWxsID0gIkphY2NhcmRcbnNpbWlsYXJpdHkiKQpnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnMDJfb2JsaXF1ZV9qYWNjYXJkX2RlbW9iYWwucG5nIikKYGBgCgojIyBEZXZlbG9wbWVudGFsIGNvbXBhcmlzb25zCgpgYGB7ciBkZXYgY29tcCBhbGwgc2l0ZXMsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAxLjJ9CiMgRklHVVJFIFM1LCBGSUdVUkUgUzYsIEZJR1VSRSBTNywgRklHVVJFIFM4LCBGSUdVUkUgUzkKcGxvdF9ncmlkKGhlYXRtYXBfY29tcF9mdW4oCiAgZWZhX2xpc3QgPSBsaXN0KGVmYV91c19hZHVsdHMsIGVmYV91c19jaGlsZHJlbiksIHBhZGRpbmcgPSBGKSwKICBkZXZfY29uZ19wbG90X2Z1bihjb25nX2RmX2NoaWxkcmVuLCB3aGljaF9jb3VudHJ5ID0gIlVTIiwgcGFkZGluZyA9IFQpLAogIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMiwgMS41KSwgbGFiZWxzID0gIkFVVE8iKQpnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnUzA1X29ibGlxdWVfZGVtb2JhbC5wbmciKQoKcGxvdF9ncmlkKGhlYXRtYXBfY29tcF9mdW4oCiAgZWZhX2xpc3QgPSBsaXN0KGVmYV9naF9hZHVsdHMsIGVmYV9naF9jaGlsZHJlbiksIHBhZGRpbmcgPSBGKSwKICBkZXZfY29uZ19wbG90X2Z1bihjb25nX2RmX2NoaWxkcmVuLCB3aGljaF9jb3VudHJ5ID0gIkdoYW5hIiwgcGFkZGluZyA9IFQpLAogIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMiwgMS41KSwgbGFiZWxzID0gIkFVVE8iKQpnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnUzA2X29ibGlxdWVfZGVtb2JhbC5wbmciKQoKcGxvdF9ncmlkKGhlYXRtYXBfY29tcF9mdW4oCiAgZWZhX2xpc3QgPSBsaXN0KGVmYV90aF9hZHVsdHMsIGVmYV90aF9jaGlsZHJlbiksIHBhZGRpbmcgPSBGKSwKICBkZXZfY29uZ19wbG90X2Z1bihjb25nX2RmX2NoaWxkcmVuLCB3aGljaF9jb3VudHJ5ID0gIlRoYWlsYW5kIiwgcGFkZGluZyA9IFQpLAogIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMiwgMS41KSwgbGFiZWxzID0gIkFVVE8iKQpnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnUzA3X29ibGlxdWVfZGVtb2JhbC5wbmciKQoKcGxvdF9ncmlkKGhlYXRtYXBfY29tcF9mdW4oCiAgZWZhX2xpc3QgPSBsaXN0KGVmYV9jaF9hZHVsdHMsIGVmYV9jaF9jaGlsZHJlbiksIHBhZGRpbmcgPSBGKSwKICBkZXZfY29uZ19wbG90X2Z1bihjb25nX2RmX2NoaWxkcmVuLCB3aGljaF9jb3VudHJ5ID0gIkNoaW5hIiwgcGFkZGluZyA9IFQpLAogIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMiwgMS41KSwgbGFiZWxzID0gIkFVVE8iKQpnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnUzA4X29ibGlxdWVfZGVtb2JhbC5wbmciKQoKcGxvdF9ncmlkKGhlYXRtYXBfY29tcF9mdW4oCiAgZWZhX2xpc3QgPSBsaXN0KGVmYV92dF9hZHVsdHMsIGVmYV92dF9jaGlsZHJlbiksIHBhZGRpbmcgPSBGKSwKICBkZXZfY29uZ19wbG90X2Z1bihjb25nX2RmX2NoaWxkcmVuLCB3aGljaF9jb3VudHJ5ID0gIlZhbnVhdHUiLCBwYWRkaW5nID0gVCksCiAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygyLCAxLjUpLCBsYWJlbHMgPSAiQVVUTyIpCmdnc2F2ZSgiLi4vZmlndXJlcy9maWdTMDlfb2JsaXF1ZV9kZW1vYmFsLnBuZyIpCmBgYAoKYGBge3IgbG9hZGluZ3MgYWxsIHNhbXBsZXMsIGZpZy53aWR0aCA9IDYuNSwgZmlnLmFzcCA9IDAuNn0KIyBGSUdVUkUgMQpoZWF0bWFwX2NvbXBfZnVuKGxpc3QoZWZhX3VzX2FkdWx0cywgZWZhX2doX2FkdWx0cywgZWZhX3RoX2FkdWx0cywgCiAgICAgICAgICAgICAgICAgICAgICBlZmFfY2hfYWR1bHRzLCBlZmFfdnRfYWR1bHRzLCAKICAgICAgICAgICAgICAgICAgICAgIGVmYV91c19jaGlsZHJlbiwgZWZhX2doX2NoaWxkcmVuLCBlZmFfdGhfY2hpbGRyZW4sIAogICAgICAgICAgICAgICAgICAgICAgZWZhX2NoX2NoaWxkcmVuLCBlZmFfdnRfY2hpbGRyZW4pLCAKICAgICAgICAgICAgICAgICBmYWNldF9vcmRlcl92YXJzID0gYygiYWdlX2dyb3VwIiwgImNvdW50cnkiLCAiZm51bSIpLAogICAgICAgICAgICAgICAgIGZhY2V0X2xhYl9zcGxpdCA9IFQpICsKICB0aGVtZShwYW5lbC5zcGFjaW5nLnggPSB1bml0KGMocmVwKDAuMiwgNCksIDEsIHJlcCgwLjIsIDQpKSwgImxpbmUiKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKwogIGd1aWRlcyhmaWxsID0gZ3VpZGVfY29sb3JiYXIoYmFyd2lkdGggPSAzMCwgYmFyaGVpZ2h0ID0gMC41LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIkZhY3RvciBsb2FkaW5nIiwgdGl0bGUudmp1c3QgPSAxKSkKZ2dzYXZlKCIuLi9maWd1cmVzL2ZpZzAxX29ibGlxdWVfZGVtb2JhbC5wbmciKQpgYGAKCmBgYHtyIGRvbWluYW50IGZhY3RvciwgZmlnLndpZHRoID0gNi41LCBmaWcuYXNwID0gMC42LCBpbmNsdWRlID0gRn0KIyBoaWdobGlnaHRpbmcgZG9taW5hbnQgZmFjdG9yIChpZ25vcmluZyBjcm9zcy1sb2FkaW5ncyA+IDAuMDUpCmxvYWRpbmdzX2FsbCA8LSBsb2FkaW5nc19hZHVsdHMgJT4lCiAgc2VsZWN0KC1jb250YWlucygib3JkIikpICU+JQogIGZ1bGxfam9pbihsb2FkaW5nc19jaGlsZHJlbiAlPiUKICAgICAgICAgICAgICBzZWxlY3QoLWNvbnRhaW5zKCJvcmQiKSkpCgpkb21fZmFjdG9yc19hbGwgPC0gbG9hZGluZ3NfYWxsICU+JQogIGdyb3VwX2J5KGNvdW50cnksIGFnZV9ncm91cCwgY2FwYWNpdHkpICU+JSAKICB0b3BfbigxLCBhYnMobG9hZGluZykpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBzZWxlY3QoY291bnRyeSwgYWdlX2dyb3VwLCBjYXBhY2l0eSwgZmFjdG9yLCBsb2FkaW5nKSAlPiUKICByZW5hbWUoZG9tX2ZhY3RvciA9IGZhY3RvciwKICAgICAgICAgZG9tX2xvYWRpbmcgPSBsb2FkaW5nKQoKcmVjdF9kZiA8LSBsb2FkaW5nc19hbGwgJT4lCiAgZnVsbF9qb2luKGRvbV9mYWN0b3JzX2FsbCkgJT4lCiAgbXV0YXRlKGZudW0gPSBnc3ViKCIuKl9GIiwgIkYiLCBmYWN0b3IpKSAlPiUKICBzZWxlY3QoLXN0YXJ0c193aXRoKCJmYWN0b3IiKSkgJT4lCiAgc3ByZWFkKGZudW0sIGxvYWRpbmcpICU+JQogIG11dGF0ZShkaWZmMSA9IGFicyhkb21fbG9hZGluZykgLSBhYnMoRjEpLAogICAgICAgICBkaWZmMiA9IGFicyhkb21fbG9hZGluZykgLSBhYnMoRjIpLAogICAgICAgICBkaWZmMyA9IGFicyhkb21fbG9hZGluZykgLSBhYnMoRjMpLAogICAgICAgICBkaWZmNCA9IGFicyhkb21fbG9hZGluZykgLSBhYnMoRjQpKSAlPiUKICBzZWxlY3QoLWMoZG9tX2xvYWRpbmcsIHN0YXJ0c193aXRoKCJGIikpKSAlPiUKICBnYXRoZXIod2hpY2hfZGlmZiwgZGlmZiwgc3RhcnRzX3dpdGgoImRpZmYiKSkgJT4lCiAgZmlsdGVyKGRpZmYgIT0gMCwgIWlzLm5hKGRpZmYpKSAlPiUKICBncm91cF9ieShjb3VudHJ5LCBhZ2VfZ3JvdXAsIGNhcGFjaXR5KSAlPiUKICB0b3BfbigtMSwgZGlmZikgJT4lCiAgdW5ncm91cCgpICU+JQogIG11dGF0ZShhbnlfc21hbGwgPSBkaWZmIDwgMC4wNSkgJT4lCiAgcmVuYW1lKGZhY3RvciA9IGRvbV9mYWN0b3IpICU+JQogIGxlZnRfam9pbihmdWxsX2pvaW4oZmFjdG9yX25hbWVzX2FkdWx0cywgZmFjdG9yX25hbWVzX2NoaWxkcmVuKSkKCiMgYW5hbG9nIHRvIEZJR1VSRSAxCnRlbXBfY2FwX29yZGVyIDwtIGZhLnNvcnQoZWZhX3VzX2FkdWx0cykkbG9hZGluZ3NbXSAlPiUgcm93bmFtZXMoKSAlPiUgcmV2KCkKCmdncGxvdChyZWN0X2RmICU+JQogICAgICAgICBmaWx0ZXIoIWlzLm5hKGFueV9zbWFsbCkpICU+JQogICAgICAgICBtdXRhdGUoY2FwYWNpdHkgPSBmYWN0b3IoY2FwYWNpdHksIGxldmVscyA9IHRlbXBfY2FwX29yZGVyKSksCiAgICAgICBhZXMoeCA9IGZhY3Rvcl9sYWJkZXNjcmlwdCwgCiAgICAgICAgICAgeSA9IGNhcGFjaXR5LCAKICAgICAgICAgICBmaWxsID0gYW55X3NtYWxsKSkgKwogIGZhY2V0X2dyaWQofiBpbnRlcmFjdGlvbihjb3VudHJ5LCBhZ2VfZ3JvdXApLCBzcGFjZSA9ICJmcmVlIiwgc2NhbGVzID0gImZyZWUiKSArCiAgZ2VvbV90aWxlKCkgKwogIHRoZW1lKHBhbmVsLnNwYWNpbmcueCA9IHVuaXQoYyhyZXAoMC4yLCA0KSwgMSwgcmVwKDAuMiwgNCkpLCAibGluZSIpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikKIyBnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnMDF2Ml9vYmxpcXVlX2RlbW9iYWwucG5nIikKYGBgCgpgYGB7ciBsb2FkaW5ncyBhbGwgc2FtcGxlcyB2MiwgZmlnLndpZHRoID0gNi41LCBmaWcuYXNwID0gMC42fQojIGFsdGVybmF0aXZlIHRvIEZJR1VSRSAxCmxvYWRpbmdzX2FkdWx0cyAlPiUKICBiaW5kX3Jvd3MobG9hZGluZ3NfY2hpbGRyZW4pICU+JQogICMgc2VsZWN0KC1jb250YWlucygiX29yZCIpKSAlPiUKICBtdXRhdGUoZmFjdG9yX2JobSA9IGNhc2Vfd2hlbigKICAgIGdyZXBsKCJib2R5IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHQpKSB+ICJCT0RZLWxpa2UgZmFjdG9ycyIsCiAgICBncmVwbCgibWluZCIsIHRvbG93ZXIoZmFjdG9yX2Rlc2NyaXB0KSkgfiAiTUlORC1saWtlIGZhY3RvcnMiLAogICAgZ3JlcGwoImhlYXJ0IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHQpKSB+ICJIRUFSVC1saWtlIGZhY3RvcnMiLAogICAgVFJVRSB+ICJPdGhlciIpKSAlPiUKICBsZWZ0X2pvaW4oc3Ryb25nX25vbmNyb3NzX2xvYWRfYWxsICU+JSAKICAgICAgICAgICAgICBzZWxlY3QoZmFjdG9yLCBjYXBhY2l0eSwgc3Ryb25nX2xvYWQsIGNyb3NzX2xvYWQpKSAlPiUKICBtdXRhdGUoZm9udF9mYWNlID0gY2FzZV93aGVuKAogICAgc3Ryb25nX2xvYWQgPT0gMSAmIGlzLm5hKGNyb3NzX2xvYWQpIH4gImJvbGQiLAogICAgVFJVRSB+ICJwbGFpbiIpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKHBhc3RlKGdzdWIoIkZhY3RvciAiLCAiRiIsIGZhY3Rvcl9uYW1lKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfZGVzY3JpcHQsIHNlcCA9ICI6ICIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGFzLm51bWVyaWMoY291bnRyeSkpLCAKICAgICAgICAgICAgIHkgPSByZW9yZGVyKGNhcGFjaXR5X29yZF91cywgZGVzYyhjYXBhY2l0eV9vcmRfdXMpKSwKICAgICAgICAgICAgIGZpbGwgPSBsb2FkaW5nKSkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoZmFjdG9yX2JobSwgYWdlX2dyb3VwKSwgCiAgICAgICAgICAgICBzY2FsZXMgPSAiZnJlZSIsIHNwYWNlID0gImZyZWUiKSArCiAgZ2VvbV90aWxlKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuMikgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSBmb3JtYXQocm91bmQobG9hZGluZywgMiksIG5zbWFsbCA9IDIpLCAKICAgICAgICAgICAgICAgIGZvbnRmYWNlID0gZm9udF9mYWNlKSwgc2l6ZSA9IDMpICsKICBzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlID0gIlJkWWxCdSIsIGxpbWl0cyA9IGMoLTEsIDEpKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSwKICAgICAgICBwYW5lbC5zcGFjaW5nLnggPSB1bml0KGMoMC4yLCAxLCAwLjIsIDEsIDAuMiwgMSwgMC4yKSwgImxpbmUiKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKwogIGd1aWRlcyhmaWxsID0gZ3VpZGVfY29sb3JiYXIoYmFyd2lkdGggPSAzMCwgYmFyaGVpZ2h0ID0gMC41LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIkZhY3RvciBsb2FkaW5nIiwgdGl0bGUudmp1c3QgPSAxKSkKICAjIHNlbGVjdChjb3VudHJ5LCBjYXBhY2l0eSwgbG9hZGluZykgJT4lCiAgIyBtdXRhdGUobG9hZGluZyA9IHJvdW5kKGxvYWRpbmcsIDIpKSAlPiUKICAjIHNwcmVhZChjb3VudHJ5LCBsb2FkaW5nKQpnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnMDF2Ml9vYmxpcXVlX2RlbW9iYWwucG5nIikKYGBgCgojIyBPdGhlciBtZXRyaWNzIG9mIHNpbWlsYXJpdHkKCmBgYHtyfQpsb2FkaW5nc19hZHVsdHMgJT4lCiAgZmlsdGVyKGZhY3RvciA9PSAidXNBRFVMVFNfRjEiKSAlPiUKICBmaWx0ZXIobG9hZGluZyA+PSAwLjUwKQoKbG9hZGluZ3NfYWR1bHRzICU+JQogIGJpbmRfcm93cyhsb2FkaW5nc19jaGlsZHJlbikgJT4lCiAgIyBmaWx0ZXIoZ3JlcGwoImJvZHkiLCBmYWN0b3JfZGVzY3JpcHQpKSAlPiUKICBzZWxlY3QoY291bnRyeSwgZmFjdG9yLCBjYXBhY2l0eSwgbG9hZGluZykgJT4lCiAgZmlsdGVyKGxvYWRpbmcgPj0gMC41MCkgJT4lCiAgY291bnQoY291bnRyeSwgZmFjdG9yKQpgYGAKCmBgYHtyfQpzdHJvbmdfbG9hZGluZ3MgPC0gbG9hZGluZ3NfYWxsICU+JQogIHNlbGVjdChmYWN0b3IsIGNhcGFjaXR5LCBsb2FkaW5nKSAlPiUKICBtdXRhdGUoc3Ryb25nX2xvYWQgPSBpZmVsc2UobG9hZGluZyA+PSAwLjUsIDEsIDApKSAlPiUKICBzZWxlY3QoLWxvYWRpbmcpICU+JQogIHNwcmVhZChmYWN0b3IsIHN0cm9uZ19sb2FkKQpgYGAKCmBgYHtyfQpjb21wYXJlX2Z1biA8LSBmdW5jdGlvbih4LCB5KSB7CiAgcmVzIDwtIHggPT0geQogIHJlcyA8LSBzdW0ocmVzKS9sZW5ndGgoeCkKICByZXR1cm4ocmVzKQp9CmBgYAoKYGBge3J9CmNvbXBhcmVfZnVuKHN0cm9uZ19sb2FkaW5ncyRjaEFEVUxUU19GMSwgc3Ryb25nX2xvYWRpbmdzJGNoQURVTFRTX0YyKQpgYGAKCmBgYHtyfQpiaW5fc2ltIDwtIGxvYWRpbmdzX2FsbCAlPiUKICBzZWxlY3QoZmFjdG9yLCBjYXBhY2l0eSwgbG9hZGluZykgJT4lCiAgbXV0YXRlKHN0cm9uZ19sb2FkID0gaWZlbHNlKGxvYWRpbmcgPj0gMC41LCAxLCAwKSkgJT4lCiAgc2VsZWN0KC1sb2FkaW5nKSAlPiUKICBzcHJlYWQoZmFjdG9yLCBzdHJvbmdfbG9hZCkgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKCJjYXBhY2l0eSIpICU+JQogIHQoKSAlPiUKICBkaXN0KG1ldGhvZCA9ICJiaW5hcnkiLCBkaWFnID0gVCwgdXBwZXIgPSBUKSAlPiUKICBhcy5tYXRyaXgoKSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJmYWN0b3JfQSIpICU+JQogIGdhdGhlcihmYWN0b3JfQiwgYmluX3NpbSwgLWZhY3Rvcl9BKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoYmluX3NpbSwgCiAgICAgICBhZXMoeCA9IGZhY3Rvcl9BLCB5ID0gZmFjdG9yX0IsIGZpbGwgPSBiaW5fc2ltKSkgKwogIGdlb21fdGlsZSgpCmBgYAoKYGBge3J9CnN0cm9uZ19sb2FkX2Z1biA8LSBmdW5jdGlvbih3aGljaF9iYXNlLCB3aGljaF9iaG0sIHdoaWNoX2FnZV9ncm91cCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXRvZmYpIHsKICBkZiA8LSBsb2FkaW5nc19hZHVsdHMgJT4lCiAgICBiaW5kX3Jvd3MobG9hZGluZ3NfY2hpbGRyZW4pICU+JQogICAgZmlsdGVyKGdyZXBsKHdoaWNoX2JobSwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHQpKSkgJT4lCiAgICBzZWxlY3QoY2FwYWNpdHksIGZhY3RvciwgbG9hZGluZykgJT4lCiAgICBzcHJlYWQoZmFjdG9yLCBsb2FkaW5nKSAlPiUKICAgIGZpbHRlcl9hdCh2YXJzKC1jYXBhY2l0eSksIGFueV92YXJzKC4gPiBjdXRvZmYpKSAlPiUKICAgIGdhdGhlcihmYWN0b3IsIGxvYWRpbmcsIC1jYXBhY2l0eSkgJT4lCiAgICBtdXRhdGUoc3Ryb25nX2xvYWQgPSBpZmVsc2UobG9hZGluZyA+IGN1dG9mZiwgVCwgRikpICU+JQogICAgY291bnQoZmFjdG9yLCBzdHJvbmdfbG9hZCkgJT4lCiAgICBncm91cF9ieShmYWN0b3IpICU+JQogICAgbXV0YXRlKHByb3Bfc3Ryb25nX2xvYWQgPSBuL3N1bShuKSkgJT4lCiAgICBmaWx0ZXIoc3Ryb25nX2xvYWQgPT0gVCkgJT4lCiAgICBzZWxlY3QoZmFjdG9yLCBwcm9wX3N0cm9uZ19sb2FkKSAlPiUKICAgIGxlZnRfam9pbihmdWxsX2pvaW4oZmFjdG9yX25hbWVzX2FkdWx0cywgZmFjdG9yX25hbWVzX2NoaWxkcmVuKSkgJT4lCiAgICBtdXRhdGUoZmFjdG9yX2JobSA9IGNhc2Vfd2hlbigKICAgICAgZ3JlcGwoImJvZHkiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdCkpIH4gIkJPRFktbGlrZSBmYWN0b3JzIiwKICAgICAgZ3JlcGwoIm1pbmQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdCkpIH4gIk1JTkQtbGlrZSBmYWN0b3JzIiwKICAgICAgZ3JlcGwoImhlYXJ0IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHQpKSB+ICJIRUFSVC1saWtlIGZhY3RvcnMiLAogICAgICBUUlVFIH4gIk90aGVyIikpICU+JQogICAgZmlsdGVyKGFzLmNoYXJhY3RlcihhZ2VfZ3JvdXApICVpbiUgd2hpY2hfYWdlX2dyb3VwKQogIAogIHJldHVybihkZikKfQpgYGAKCmBgYHtyfQpzdHJvbmdfbG9hZF9wbG90X2Z1biA8LSBmdW5jdGlvbihzdHJvbmdfZGYsIHdoaWNoX2JobSkgewogIGcgPC0gc3Ryb25nX2RmICU+JQogICAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihmYWN0b3IsIGFzLm51bWVyaWMoY291bnRyeSkpLCAKICAgICAgICAgICAgICAgeSA9IHByb3Bfc3Ryb25nX2xvYWQsIGZpbGwgPSBjb3VudHJ5KSkgKwogICAgZmFjZXRfZ3JpZCguIH4gZmFjdG9yX2JobSwgc2NhbGVzID0gImZyZWVfeCIsIHNwYWNlID0gImZyZWVfeCIpICsKICAgIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArCiAgICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMSkpICsKICAgIGxhYnModGl0bGUgPSBwYXN0ZTAodG91cHBlcih3aGljaF9iaG0pLCAiLWxpa2UgZmFjdG9ycyIpKSAKICAKICByZXR1cm4oZykKfQpgYGAKCmBgYHtyfQpzdHJvbmdfbG9hZF9mdW4od2hpY2hfYmhtID0gImJvZHkiLCB3aGljaF9hZ2VfZ3JvdXAgPSAiYWR1bHRzIiwgY3V0b2ZmID0gMC41KQpzdHJvbmdfbG9hZF9mdW4od2hpY2hfYmhtID0gImhlYXJ0Iiwgd2hpY2hfYWdlX2dyb3VwID0gImFkdWx0cyIsIGN1dG9mZiA9IDAuNSkKc3Ryb25nX2xvYWRfZnVuKHdoaWNoX2JobSA9ICJtaW5kIiwgd2hpY2hfYWdlX2dyb3VwID0gImFkdWx0cyIsIGN1dG9mZiA9IDAuNSkKYGBgCgoKYGBge3J9CnN0cm9uZ19sb2FkX2Z1bih3aGljaF9iaG0gPSAiYm9keSIsIHdoaWNoX2FnZV9ncm91cCA9ICJhZHVsdHMiLCBjdXRvZmYgPSAwLjUpICU+JQogIHN0cm9uZ19sb2FkX3Bsb3RfZnVuKHdoaWNoX2JobSA9ICJib2R5IikKc3Ryb25nX2xvYWRfZnVuKHdoaWNoX2JobSA9ICJoZWFydCIsIHdoaWNoX2FnZV9ncm91cCA9ICJhZHVsdHMiLCBjdXRvZmYgPSAwLjUpCnN0cm9uZ19sb2FkX2Z1bih3aGljaF9iaG0gPSAibWluZCIsIHdoaWNoX2FnZV9ncm91cCA9ICJhZHVsdHMiLCBjdXRvZmYgPSAwLjUpCmBgYAoKCiMjIFZhcmlhbmNlIGFjY291bnRlZCBmb3IKCmBgYHtyfQpWYWNjb3VudGVkX2Z1biA8LSBmdW5jdGlvbihlZmFfbmFtZSkgewogIGNvdW50cnkgPC0gZ3N1YigiZWZhXyIsICIiLCBlZmFfbmFtZSkKICBjb3VudHJ5IDwtIGdzdWIoIl8uKiQiLCAiIiwgY291bnRyeSkKICBhZ2VfZ3JvdXAgPC0gY2FzZV93aGVuKGdyZXBsKCJhZHVsdCIsIGVmYV9uYW1lKSB+ICJhZHVsdHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoImNoaWxkIiwgZWZhX25hbWUpIH4gImNoaWxkcmVuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQV9jaGFyYWN0ZXJfKQogIAogIGVmYSA8LSBnZXQoZWZhX25hbWUpCiAgcmVzIDwtIGVmYSRWYWNjb3VudGVkICU+JQogICAgZGF0YS5mcmFtZSgpICU+JQogICAgcm93bmFtZXNfdG9fY29sdW1uKCJtZXRyaWMiKSAlPiUKICAgIG11dGF0ZShjb3VudHJ5ID0gZmFjdG9yKGNvdW50cnksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygidXMiLCAiZ2giLCAidGgiLCAiY2giLCAidnQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGxldmVsc19jb3VudHJ5KSwKICAgICAgICAgICBhZ2VfZ3JvdXAgPSBmYWN0b3IoYWdlX2dyb3VwLCBsZXZlbHMgPSBjKCJhZHVsdHMiLCAiY2hpbGRyZW4iKSkpCiAgCiAgcmV0dXJuKHJlcykKfQpgYGAKCmBgYHtyfQpWYWNjb3VudGVkX2FsbCA8LSBWYWNjb3VudGVkX2Z1bigiZWZhX3VzX2FkdWx0cyIpICU+JQogIGZ1bGxfam9pbihWYWNjb3VudGVkX2Z1bigiZWZhX2doX2FkdWx0cyIpKSAlPiUKICBmdWxsX2pvaW4oVmFjY291bnRlZF9mdW4oImVmYV90aF9hZHVsdHMiKSkgJT4lCiAgZnVsbF9qb2luKFZhY2NvdW50ZWRfZnVuKCJlZmFfY2hfYWR1bHRzIikpICU+JQogIGZ1bGxfam9pbihWYWNjb3VudGVkX2Z1bigiZWZhX3Z0X2FkdWx0cyIpKSAlPiUKICBmdWxsX2pvaW4oVmFjY291bnRlZF9mdW4oImVmYV91c19jaGlsZHJlbiIpKSAlPiUKICBmdWxsX2pvaW4oVmFjY291bnRlZF9mdW4oImVmYV9naF9jaGlsZHJlbiIpKSAlPiUKICBmdWxsX2pvaW4oVmFjY291bnRlZF9mdW4oImVmYV90aF9jaGlsZHJlbiIpKSAlPiUKICBmdWxsX2pvaW4oVmFjY291bnRlZF9mdW4oImVmYV9jaF9jaGlsZHJlbiIpKSAlPiUKICBmdWxsX2pvaW4oVmFjY291bnRlZF9mdW4oImVmYV92dF9jaGlsZHJlbiIpKQpgYGAKCmBgYHtyfQpWYWNjb3VudGVkX2FsbCAlPiUKICBmaWx0ZXIobWV0cmljICVpbiUgYygiUHJvcG9ydGlvbiBWYXIiLCAiUHJvcG9ydGlvbiBFeHBsYWluZWQiKSkgJT4lCiAgZ2F0aGVyKGZhY3RvciwgdmFsdWUsIHN0YXJ0c193aXRoKCJGIikpICU+JQogIG11dGF0ZSh2YWx1ZSA9IHJvdW5kKHZhbHVlLCAyKSkgJT4lCiAgc3ByZWFkKGNvdW50cnksIHZhbHVlKSAlPiUKICBhcnJhbmdlKGFnZV9ncm91cCwgZmFjdG9yLCBtZXRyaWMpCmBgYApgYGB7cn0KVmFjY291bnRlZF9hbGwgJT4lCiAgZmlsdGVyKG1ldHJpYyA9PSAiQ3VtdWxhdGl2ZSBWYXIiKSAlPiUKICBnYXRoZXIoZmFjdG9yLCB2YWx1ZSwgc3RhcnRzX3dpdGgoIkYiKSkgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSwgYWdlX2dyb3VwKSAlPiUKICB0b3BfbigxLCB2YWx1ZSkgJT4lCiAgdW5ncm91cCgpICU+JQogIG11dGF0ZSh2YWx1ZSA9IHJvdW5kKHZhbHVlLCAyKSkgJT4lCiAgc2VsZWN0KG1ldHJpYywgY291bnRyeSwgYWdlX2dyb3VwLCB2YWx1ZSkgJT4lCiAgc3ByZWFkKGNvdW50cnksIHZhbHVlKSAlPiUKICBhcnJhbmdlKGFnZV9ncm91cCwgbWV0cmljKQpgYGAKIyMgSW50ZXJmYWN0b3IgY29ycmVsYXRpb25zCgpgYGB7cn0KaW50ZXJmYWN0b3JfY29yX2Z1biA8LSBmdW5jdGlvbihlZmFfbmFtZSkgewogIHNhbXBsZSA9IGdzdWIoImVmYV8iLCAiIiwgZWZhX25hbWUpCiAgY291bnRyeSA9IGdzdWIoIl8uKiQiLCAiIiwgc2FtcGxlKQogIGFnZV9ncm91cCA9IGdzdWIoIl4uKl8iLCAiIiwgc2FtcGxlKQogIAogIGVmYSA8LSBnZXQoZWZhX25hbWUpCiAgCiAgIyBoYWNreSwgbm90IHN1cmUgd2h5IHRoaXMgd29ya3MsIGJ1dCBpdCdzIHRoZSBvbmx5IHdheSBpIGNvdWxkIGdldCBDSXMKICBkZiA8LSBwcmludChlZmEpICU+JQogICAgZGF0YS5mcmFtZSgpICU+JQogICAgcm93bmFtZXNfdG9fY29sdW1uKCJmYWN0b3JfcGFpciIpICU+JQogICAgc2VwYXJhdGUoZmFjdG9yX3BhaXIsIGMoImZhY3Rvcl9BIiAsImZhY3Rvcl9CIiksIHNlcCA9ICItIikgJT4lCiAgICBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgiZmFjdG9yIikpLCB+IGdzdWIoIl4uKl8iLCAiIiwgLikpCiAgCiAgIyBkZiA8LSBlZmEkUGhpICU+JQogICMgICBkYXRhLmZyYW1lKCkgJT4lCiAgIyAgIHJvd25hbWVzX3RvX2NvbHVtbigiZmFjdG9yX0EiKQogICMgZ2F0aGVyKGZhY3Rvcl9CLCBwaGksIC1mYWN0b3JfQSkKICAKICBkZiA8LSBkZiAlPiUKICBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgiZmFjdG9yIikpLAogICAgICAgICAgICB+IHBhc3RlMChjb3VudHJ5LCB0b3VwcGVyKGFnZV9ncm91cCksICJfIiwgLikpICU+JQogICAgbXV0YXRlKGNvdW50cnkgPSBmYWN0b3IoY291bnRyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoInVzIiwgImdoIiwgInRoIiwgImNoIiwgInZ0IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBsZXZlbHNfY291bnRyeSksCiAgICAgICAgICAgYWdlX2dyb3VwID0gZmFjdG9yKGFnZV9ncm91cCwgbGV2ZWxzID0gYygiYWR1bHRzIiwgImNoaWxkcmVuIikpKQogIAogIHJldHVybihkZikKfQpgYGAKCmBgYHtyLCByZXN1bHRzID0gImhpZGUifQpkX3BoaSA8LSBiaW5kX3Jvd3MoaW50ZXJmYWN0b3JfY29yX2Z1bigiZWZhX3VzX2FkdWx0cyIpLAogICAgICAgICAgICAgICAgICAgaW50ZXJmYWN0b3JfY29yX2Z1bigiZWZhX2doX2FkdWx0cyIpLAogICAgICAgICAgICAgICAgICAgaW50ZXJmYWN0b3JfY29yX2Z1bigiZWZhX3RoX2FkdWx0cyIpLAogICAgICAgICAgICAgICAgICAgaW50ZXJmYWN0b3JfY29yX2Z1bigiZWZhX2NoX2FkdWx0cyIpLAogICAgICAgICAgICAgICAgICAgaW50ZXJmYWN0b3JfY29yX2Z1bigiZWZhX3Z0X2FkdWx0cyIpLAogICAgICAgICAgICAgICAgICAgaW50ZXJmYWN0b3JfY29yX2Z1bigiZWZhX3VzX2NoaWxkcmVuIiksCiAgICAgICAgICAgICAgICAgICBpbnRlcmZhY3Rvcl9jb3JfZnVuKCJlZmFfZ2hfY2hpbGRyZW4iKSwKICAgICAgICAgICAgICAgICAgIGludGVyZmFjdG9yX2Nvcl9mdW4oImVmYV90aF9jaGlsZHJlbiIpLAogICAgICAgICAgICAgICAgICAgaW50ZXJmYWN0b3JfY29yX2Z1bigiZWZhX2NoX2NoaWxkcmVuIiksCiAgICAgICAgICAgICAgICAgICBpbnRlcmZhY3Rvcl9jb3JfZnVuKCJlZmFfdnRfY2hpbGRyZW4iKSkKYGBgCmBgYHtyfQpkX3BoaSA8LSBkX3BoaSAlPiUKICBmdWxsX2pvaW4oZF9waGkgJT4lCiAgICAgICAgICAgICAgcmVuYW1lX2FsbCh+IGdzdWIoImZhY3Rvcl9BIiwgImZhY3Rvcl9DIiwgLikpICU+JQogICAgICAgICAgICAgIHJlbmFtZV9hbGwofiBnc3ViKCJmYWN0b3JfQiIsICJmYWN0b3JfRCIsIC4pKSAlPiUKICAgICAgICAgICAgICByZW5hbWVfYWxsKH4gZ3N1YigiZmFjdG9yX0QiLCAiZmFjdG9yX0EiLCAuKSkgJT4lCiAgICAgICAgICAgICAgcmVuYW1lX2FsbCh+IGdzdWIoImZhY3Rvcl9DIiwgImZhY3Rvcl9CIiwgLikpKSAlPiUgZGlzdGluY3QoKQpgYGAKCmBgYHtyfQpkX3BoaSA8LSBkX3BoaSAlPiUKICBzZWxlY3QoLWNvdW50cnksIC1hZ2VfZ3JvdXApICU+JQogIGxlZnRfam9pbihmYWN0b3JfbmFtZXNfYWR1bHRzICU+JQogICAgICAgICAgICAgIGZ1bGxfam9pbihmYWN0b3JfbmFtZXNfY2hpbGRyZW4pICU+JQogICAgICAgICAgICAgIHJlbmFtZV9hbGwofnBhc3RlMCguLCAiX0EiKSkpICU+JQogIG11dGF0ZShmYWN0b3JfYmhtX0EgPSBjYXNlX3doZW4oCiAgICBncmVwbCgiYm9keSIsIHRvbG93ZXIoZmFjdG9yX2Rlc2NyaXB0X0EpKSB+ICJCb2R5LWxpa2UgZmFjdG9yIiwKICAgIGdyZXBsKCJtaW5kIiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQSkpIH4gIk1pbmQtbGlrZSBmYWN0b3IiLAogICAgZ3JlcGwoImhlYXJ0IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQSkpIH4gIkhlYXJ0LWxpa2UgZmFjdG9yIiwKICAgIFRSVUUgfiAiT3RoZXIiKSkgJT4lCiAgbGVmdF9qb2luKGZhY3Rvcl9uYW1lc19hZHVsdHMgJT4lCiAgICAgICAgICAgICAgZnVsbF9qb2luKGZhY3Rvcl9uYW1lc19jaGlsZHJlbikgJT4lCiAgICAgICAgICAgICAgcmVuYW1lX2FsbCh+cGFzdGUwKC4sICJfQiIpKSkgJT4lCiAgbXV0YXRlKGZhY3Rvcl9iaG1fQiA9IGNhc2Vfd2hlbigKICAgIGdyZXBsKCJib2R5IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQikpIH4gIkJvZHktbGlrZSBmYWN0b3IiLAogICAgZ3JlcGwoIm1pbmQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9CKSkgfiAiTWluZC1saWtlIGZhY3RvciIsCiAgICBncmVwbCgiaGVhcnQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9CKSkgfiAiSGVhcnQtbGlrZSBmYWN0b3IiLAogICAgVFJVRSB+ICJPdGhlciIpKSAlPiUKICBtdXRhdGVfYXQodmFycyhmYWN0b3JfYmhtX0EsIGZhY3Rvcl9iaG1fQiksCiAgICAgICAgICAgIH4gZmFjdG9yKC4sIGxldmVscyA9IGMoIkJvZHktbGlrZSBmYWN0b3IiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWFydC1saWtlIGZhY3RvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1pbmQtbGlrZSBmYWN0b3IiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPdGhlciIpKSkgJT4lCiAgc2VsZWN0KC1jb3VudHJ5X0IsIC1hZ2VfZ3JvdXBfQikgJT4lCiAgcmVuYW1lKGNvdW50cnkgPSBjb3VudHJ5X0EsIGFnZV9ncm91cCA9IGFnZV9ncm91cF9BKQpgYGAKCgpgYGB7ciwgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDF9CmRfcGhpICU+JQogIGdncGxvdChhZXMoeCA9IGZhY3Rvcl9iaG1fQSwgCiAgICAgICAgICAgICB5ID0gcmVvcmRlcihmYWN0b3JfYmhtX0IsIGRlc2MoZmFjdG9yX2JobV9CKSksIAogICAgICAgICAgICAgZmlsbCA9IGVzdGltYXRlKSkgKwogIGZhY2V0X2dyaWQoY291bnRyeSB+IGFnZV9ncm91cCwgc2NhbGVzID0gImZyZWUiLCBzcGFjZSA9ICJmcmVlIikgKwogIGdlb21fdGlsZShjb2xvciA9ICJibGFjayIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gZm9ybWF0KHJvdW5kKGVzdGltYXRlLCAyKSwgbnNtYWxsID0gMikpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwsIGZpbGwgPSBxdW90ZShwaGkpKQpgYGAKYGBge3IsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAwLjZ9CmRfcGhpICU+JQogIGdncGxvdChhZXMoeCA9IGZhY3Rvcl9iaG1fQSwgCiAgICAgICAgICAgICBjb2xvciA9IGNvdW50cnksCiAgICAgICAgICAgICAjIHNoYXBlID0gYWdlX2dyb3VwLAogICAgICAgICAgICAgeSA9IGVzdGltYXRlKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGx0eSA9IDUsIGNvbG9yID0gImdyYXk1MCIpICsKICBmYWNldF9ncmlkKGFnZV9ncm91cCB+IGZhY3Rvcl9iaG1fQiwgc2NhbGVzID0gImZyZWVfeCIsIHNwYWNlID0gImZyZWUiKSArCiAgZ2VvbV9wb2ludHJhbmdlKGFlcyh5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpLAogICAgICAgICAgICAgICAgICBmYXR0ZW4gPSAyKSArCiAgIyBnZW9tX3RleHQoYWVzKGxhYmVsID0gZm9ybWF0KHJvdW5kKGVzdGltYXRlLCAyKSwgbnNtYWxsID0gMikpKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoTkEsIDEpLCAKICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKDAsIDEsIDAuNSkpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBsYWJzKHggPSBOVUxMLCB5ID0gcXVvdGUocGhpKSkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDAuN30KZF9waGkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gY291bnRyeSwgCiAgICAgICAgICAgICBjb2xvciA9IGNvdW50cnksCiAgICAgICAgICAgICBncm91cCA9IGFnZV9ncm91cCwgc2hhcGUgPSBhZ2VfZ3JvdXAsCiAgICAgICAgICAgICB5ID0gZXN0aW1hdGUpKSArCiAgZmFjZXRfZ3JpZChmYWN0b3JfYmhtX0EgfiBmYWN0b3JfYmhtX0IsIHNjYWxlcyA9ICJmcmVlX3giLCBzcGFjZSA9ICJmcmVlIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGx0eSA9IDIsIGNvbG9yID0gImdyZXk1MCIpICsKICBnZW9tX3BvaW50cmFuZ2UoYWVzKHltaW4gPSBsb3dlciwgeW1heCA9IHVwcGVyKSwKICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSkpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICAjIGdlb21fdGV4dChhZXMoeSA9IGlmZWxzZShhZ2VfZ3JvdXAgPT0gImFkdWx0cyIsIAogICMgICAgICAgICAgICAgICAgICAgICAgICAgIGVzdGltYXRlICsgMC4xLAogICMgICAgICAgICAgICAgICAgICAgICAgICAgIGVzdGltYXRlIC0gMC4wNSksCiAgIyAgICAgICAgICAgICAgIGxhYmVsID0gZm9ybWF0KHJvdW5kKGVzdGltYXRlLCAyKSwgbnNtYWxsID0gMikpLAogICMgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoTkEsIDEpLCAKICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKDAsIDEsIDAuNSkpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBsYWJzKHggPSBOVUxMLCB5ID0gcXVvdGUocGhpKSwgCiAgICAgICBzaGFwZSA9ICJBZ2UgZ3JvdXAiLCBzaXplID0gIkFnZSBncm91cCIsIAogICAgICAgY29sb3IgPSAiU2l0ZSIpCmBgYAoKYGBge3J9CmNhdCgiVVMgQURVTFRTXG4iKQplZmFfdXNfYWR1bHRzJFBoaQooZWZhX3VzX2FkdWx0cyRQaGkpXjIKCmNhdCgiXG5VUyBDSElMRFJFTlxuIikKZWZhX3VzX2NoaWxkcmVuJFBoaQooZWZhX3VzX2NoaWxkcmVuJFBoaSleMgpgYGAKCmBgYHtyfQpjYXQoIkdIQU5BIEFEVUxUU1xuIikKZWZhX2doX2FkdWx0cyRQaGkKKGVmYV9naF9hZHVsdHMkUGhpKV4yCgpjYXQoIlxuR0hBTkEgQ0hJTERSRU5cbiIpCmVmYV9naF9jaGlsZHJlbiRQaGkKKGVmYV9naF9jaGlsZHJlbiRQaGkpXjIKYGBgCgpgYGB7cn0KY2F0KCJUSEFJTEFORCBBRFVMVFNcbiIpCmVmYV90aF9hZHVsdHMkUGhpCihlZmFfdGhfYWR1bHRzJFBoaSleMgoKY2F0KCJcblRIQUlMQU5EIENISUxEUkVOXG4iKQplZmFfdGhfY2hpbGRyZW4kUGhpCihlZmFfdGhfY2hpbGRyZW4kUGhpKV4yCmBgYAoKYGBge3J9CmNhdCgiQ0hJTkEgQURVTFRTXG4iKQplZmFfY2hfYWR1bHRzJFBoaQooZWZhX2NoX2FkdWx0cyRQaGkpXjIKCmNhdCgiXG5DSElOQSBDSElMRFJFTlxuIikKZWZhX2NoX2NoaWxkcmVuJFBoaQooZWZhX2NoX2NoaWxkcmVuJFBoaSleMgpgYGAKCmBgYHtyfQpjYXQoIlZBTlVBVFUgQURVTFRTXG4iKQplZmFfdnRfYWR1bHRzJFBoaQooZWZhX3Z0X2FkdWx0cyRQaGkpXjIKCmNhdCgiXG5WQU5VQVRVIENISUxEUkVOXG4iKQplZmFfdnRfY2hpbGRyZW4kUGhpCihlZmFfdnRfY2hpbGRyZW4kUGhpKV4yCmBgYAoKYGBge3J9CgpgYGAKCgo=